onSwipe事件不是ViewPager内触发 [英] onSwipe Event is not Triggered inside a ViewPager

查看:277
本文介绍了onSwipe事件不是ViewPager内触发的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请参见下面的更新
我有一个 ViewPager ,第一页(片段)它有一个 DrawerLayout 实现了一个 SimpleOnGestureListener 侦听 onSwipe 事件。在 onSwipe 事件 DrawerLayout (片段)的目的是,如果用户扫描到<$ C $听C>左和右键触发的抽屉的开幕式和闭幕式。

问题是由时间,我刷到向左或向右中的 ViewPager的页面修改的,而不是引发的开幕式和闭幕式的抽屉

有没有办法为停用的临时刷卡的 ViewPager ,而其目前的观点是对 DrawerLayout ,以便它可以侦听到左和右的事件?

如果抽屉的打开的,如果我轻扫屏幕向右那么这就是时间的页面变化。我一直在这个挣扎了几天了。

我这个可能在 DrawerLayoutFragment

 如果(MainClass_ViewPager.getView == getActivity()。getView)
MainClass_ViewPager.isEnabled(假)DrawerLayoutFragment`的`onSwipe被触发


抽屉

 公共类DrawerLayoutFragment扩展片段实现SimpleGestureListener {   私人SimpleGestureFilter检测器;    私人DrawerLayout mDrawerLayout;    @TargetApi(Build.VERSION_ codeS.HONEYCOMB)
    公共无效的onCreate(捆绑savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    }    @TargetApi(Build.VERSION_ codeS.ICE_CREAM_SANDWICH)
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                             捆绑savedInstanceState){        返回rootView;
    }     公共布尔onCreateOptionsMenu(菜单菜单){
            MenuInflater吹气= getActivity()getMenuInflater()。
           inflater.inflate(R.menu.main_menu,菜单);
            返回getActivity()onCreateOptionsMenu(菜单)。
        }     @覆盖
        公共布尔onOptionsItemSelected(菜单项项){             //操作栏的家/ U P动作应该打开或关闭抽屉。
             // ActionBarDrawerToggle将照顾这。
            如果(mDrawerToggle.onOptionsItemSelected(项目)){                返回true;
            }
            //手柄操作按钮
            开关(item.getItemId()){
            默认:
                Log.d(onOptionsItemSelected,内部);
                返回super.onOptionsItemSelected(项目);
            }
        }
     保护无效onPostCreate(捆绑savedInstanceState){
            super.onCreate(savedInstanceState);
            //同步onRestoreInstanceState后切换状态已经发生。
            mDrawerToggle.syncState();
        }     @覆盖
        公共无效onConfigurationChanged(配置NEWCONFIG){
            super.onConfigurationChanged(NEWCONFIG);
            //把任何配置更改抽屉toggls
            mDrawerToggle.onConfigurationChanged(NEWCONFIG);
        }    / *的点击听者在导航抽屉的ListView * /
    私有类DrawerItemClickListener实现ListView.OnItemClickListener {
        @覆盖
        公共无效onItemClick(适配器视图&LT;&GT;母公司,观景,INT位置,长的id){
            选择信息(位置);            Log.d(DrawerItemClickListener,内部);
        }
    }    私人无效选择信息(INT位置){   }    @TargetApi(Build.VERSION_ codeS.HONEYCOMB)
    公共无效的setTitle(CharSequence的标题){
        mTitle =称号;
        。getActivity()getActionBar()的setTitle(mTitle)。
    }
    //简单的手势
    公共布尔dispatchTouchEvent(MotionEvent我){
      this.detector.onTouchEvent(箱);
     返回getActivity()dispatchTouchEvent(我)。
    }    @覆盖
    公共无效onSwipe(INT方向){
        Log.d(onSwipe,onSwipe);    }    @覆盖
    公共无效onDoubleTap(){
        // TODO自动生成方法存根
        Log.d(onDoubleTap,onDoubleTap);    }}

更新 - 这是我走到这一步。我有有一个孩子ViewPager(片段)父母ViewPager,我无法处理的子ViewPager 的,因为父一个始终得到了刷卡不给为孩子之一的任何机会的刷卡。抽屉工作,沿着我按住屏幕的左侧一秒钟然后将其拖动到右边。如上图所示的图像中。

 私人无效选择信息(INT位置){
     Log.d(选择信息,内部);
       //更新替换片段的主要内容
       ViewPagerConnect片段=新ViewPagerConnect();
       捆绑ARGS =新包();
       args.putInt(位置,位置);
       fragment.setArguments(参数);       FragmentTransaction英尺= getChildFragmentManager()调用BeginTransaction()。
                 ft.add(R.id.content_frame,片段);
         ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
         ft.commit();       //更新所选项目和标题,然后关上抽屉
       mDrawerList.setItemChecked(位置,真正的);
       的setTitle(mPlanetTitles [位置]);
       mDrawerLayout.closeDrawer(mDrawerList);
   }---------------------------------------
公共类ViewPagerConnect扩展SherlockFragment {    AppSectionsPagerAdapter mAppSectionsPagerAdapter;
     ViewPager mViewPager;
     静态INT位置;    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
            捆绑savedInstanceState){        mAppSectionsPagerAdapter =新AppSectionsPagerAdapter(getChildFragmentManager());        。位置= getArguments()调用getInt(位置);         查看rootView = inflater.inflate(R.layout.viewpager_connect,集装箱,FALSE);
        mViewPager =(ViewPager)rootView.findViewById(R.id.pager);
        mViewPager.setAdapter(mAppSectionsPagerAdapter);
                返回rootView;    }    公共静态类AppSectionsPagerAdapter扩展FragmentPagerAdapter {        公共AppSectionsPagerAdapter(FragmentManager FM){
            超(FM);
        }
        @覆盖
        公众诠释的getCount(){
            返回1;
        }        @覆盖
        公共CharSequence的getPageTitle(INT位置){
            回归部分:+(位置+ 1);
        }
        @覆盖
        公共片段的getItem(INT为arg0){
             开关(为arg0){
             情况下0:
                 PlanetFragment片段=新PlanetFragment();
                 捆绑ARGS =新包();
                 args.putInt(PlanetFragment.ARG_PLANET_NUMBER,位置);
                 fragment.setArguments(参数);
                 返回片段;             }
            返回null;        }
    }}
----------------------------------------------
公共类PlanetFragment扩展SherlockFragment {     ViewPager mViewPager;
    公共静态最后弦乐ARG_PLANET_NUMBER =planet_number;    公共PlanetFragment(){
        //为子片段需要空的构造
    }    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
            捆绑savedInstanceState){
        查看rootView = inflater.inflate(R.layout.fragment_planet,集​​装箱,FALSE);
        。INT I = getArguments()调用getInt(ARG_PLANET_NUMBER);
        。字符串星球= getResources()getStringArray(R.array.planets_array)[我]        INT imageId = getResources()。则getIdentifier(planet.toLowerCase(Locale.getDefault()),
                        绘制,getActivity()getPackageName());
        ((ImageView的)rootView.findViewById(R.id.image))setImageResource(imageId)。
        getActivity()的setTitle(行星)。
        返回rootView;
    }
}
---------------------------
viewpager_connect.xml&LT; XML版本=1.0编码=UTF-8&GT?;
  &LT; android.support.v4.view.ViewPager
      的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:ID =@ + ID /寻呼机
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent/&GT;-----------------------------------------------
fragment_planet.xml&LT; ImageView的的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:ID =@ + ID /图像
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    机器人:背景=#000000
    机器人:比重=中心
    机器人:填充=32dp/&GT;


解决方案

获取演示NavDrawer的这里

如果您在ViewPager实施样品code给出的星球选择帧交换,它会正常工作。

详细内容:

在选择信息只是在'片段'对象,它是FragmentManager交易的目标得到ViewPager。这将做到这一点,你将有NavDrawer与ViewPager一起。不要禁用任何东西,因为它只是工作。

请参阅下面的planetfragement' - 只要将你的ViewPager类,它会所有的工作。取出planetfragment。添加您的ViewPager在它的地方。这是所有的u必须做的。你'viewpager'应该是一个片段,获取一个ViewPager和钩它到一个适配器。它实现了相同的接口,目前样品中的行星。只要将它

 私人无效选择信息(INT位置){
    //更新替换片段的主要内容
    片段片段=新PlanetFragment();
    捆绑ARGS =新包();
    args.putInt(PlanetFragment.ARG_PLANET_NUMBER,位置);
    fragment.setArguments(参数);    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction()取代(R.id.content_frame,片段).commit()。    //更新所选项目和标题,然后关上抽屉
    mDrawerList.setItemChecked(位置,真正的);
    的setTitle(mPlanetTitles [位置]);
    mDrawerLayout.closeDrawer(mDrawerList);
}

Please see update below I have a ViewPager, the first page(fragment) of it has a DrawerLayout that implements a SimpleOnGestureListener that listens to onSwipe event. The purpose of the onSwipe event inside the DrawerLayout(fragment) is to listen if the user swipes to left and right which triggers the opening and closing of the drawer.

The problem is by the time, I swipe to left or right the ViewPager's page changes instead of triggering the opening and closing of the Drawer.

Is there a way to disable temporarily the swiping of the ViewPager, while its current view is on DrawerLayout so that it can listen to the left and right event?

If the Drawer is opened and If I swipe the screen to the right then that's the time the page changes. I've been struggling with this for a couple of days now.

I this possible inside the DrawerLayoutFragment?

if(MainClass_ViewPager.getView == getActivity().getView)
MainClass_ViewPager.isEnabled(false)

onSwipe of `DrawerLayoutFragment`  is triggered


Drawer

public class DrawerLayoutFragment extends Fragment implements SimpleGestureListener{

   private SimpleGestureFilter detector; 

    private DrawerLayout mDrawerLayout;

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void onCreate (Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);


    }

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        return rootView;
    }

     public boolean onCreateOptionsMenu(Menu menu) {
            MenuInflater inflater = getActivity().getMenuInflater();
           inflater.inflate(R.menu.main_menu, menu);
            return getActivity().onCreateOptionsMenu(menu);
        }

     @Override
        public boolean onOptionsItemSelected(MenuItem item) {

             // The action bar home/u p action should open or close the drawer.
             // ActionBarDrawerToggle will take care of this.
            if (mDrawerToggle.onOptionsItemSelected(item)) {

                return true;
            }
            // Handle action buttons
            switch(item.getItemId()) {
            default:
                Log.d("onOptionsItemSelected", "inside");
                return super.onOptionsItemSelected(item);
            }
        }


     protected void onPostCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // Sync the toggle state after onRestoreInstanceState has occurred.
            mDrawerToggle.syncState();
        }

     @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            // Pass any configuration change to the drawer toggls
            mDrawerToggle.onConfigurationChanged(newConfig);
        }



    /* The click listner for ListView in the navigation drawer */
    private class DrawerItemClickListener implements ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            selectItem(position);

            Log.d("DrawerItemClickListener", "inside");
        }
    }

    private void selectItem(int position) {

   }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void setTitle(CharSequence title) {
        mTitle = title;
        getActivity().getActionBar().setTitle(mTitle);
    }


    //Simple Gesture
    public boolean dispatchTouchEvent(MotionEvent me){ 
      this.detector.onTouchEvent(me);
     return getActivity().dispatchTouchEvent(me); 
    }

    @Override
    public void onSwipe(int direction) {
        Log.d("onSwipe", "onSwipe");

    }

    @Override
    public void onDoubleTap() {
        // TODO Auto-generated method stub
        Log.d("onDoubleTap", "onDoubleTap");

    }

}

UPDATE - this is what I got so far. I have a parent ViewPager that has a child ViewPager(fragment), I can't handle the swiping of the child ViewPager because the parent one is always got swiped not giving any chance for the child one. The drawer is working, as along as I hold the left side of the screen for a sec then drag it to the right. As shown in the image above.

private void selectItem(int position) {
     Log.d("selectItem", "inside");
       // update the main content by replacing fragments
       ViewPagerConnect fragment = new ViewPagerConnect();
       Bundle args = new Bundle();
       args.putInt("position", position);
       fragment.setArguments(args);

       FragmentTransaction ft = getChildFragmentManager().beginTransaction();
                 ft.add(R.id.content_frame, fragment);
         ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
         ft.commit();

       // update selected item and title, then close the drawer
       mDrawerList.setItemChecked(position, true);
       setTitle(mPlanetTitles[position]);
       mDrawerLayout.closeDrawer(mDrawerList);
   }

---------------------------------------


public class ViewPagerConnect extends SherlockFragment{

    AppSectionsPagerAdapter mAppSectionsPagerAdapter;
     ViewPager mViewPager;
     static int position;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getChildFragmentManager());

        position = getArguments().getInt("position");

         View rootView = inflater.inflate(R.layout.viewpager_connect, container, false);
        mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
        mViewPager.setAdapter(mAppSectionsPagerAdapter);


                return rootView;

    }

    public static class AppSectionsPagerAdapter extends FragmentPagerAdapter {

        public AppSectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }


        @Override
        public int getCount() {
            return 1;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return "Section: " + (position + 1);
        }


        @Override
        public Fragment getItem(int arg0) {
             switch(arg0){
             case 0:
                 PlanetFragment fragment = new PlanetFragment();
                 Bundle args = new Bundle();
                 args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
                 fragment.setArguments(args);
                 return fragment;

             }
            return null;

        }
    }

}
----------------------------------------------
public class PlanetFragment extends SherlockFragment {

     ViewPager mViewPager;
    public static final String ARG_PLANET_NUMBER = "planet_number";

    public PlanetFragment() {
        // Empty constructor required for fragment subclasses
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_planet, container, false);
        int i = getArguments().getInt(ARG_PLANET_NUMBER);
        String planet = getResources().getStringArray(R.array.planets_array)[i];

        int imageId = getResources().getIdentifier(planet.toLowerCase(Locale.getDefault()),
                        "drawable", getActivity().getPackageName());
        ((ImageView) rootView.findViewById(R.id.image)).setImageResource(imageId);
        getActivity().setTitle(planet);
        return rootView;
    }
}
---------------------------
viewpager_connect.xml

<?xml version="1.0" encoding="utf-8"?>
  <android.support.v4.view.ViewPager
      xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

-----------------------------------------------
fragment_planet.xml

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/image"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000000"
    android:gravity="center"
    android:padding="32dp" />

解决方案

Get the demo NavDrawer here

If you swap in a ViewPager implementation for the Planet Selection frame given in the sample code, it will work fine.

Details:

in 'selectItem' just get a ViewPager in the 'fragment' object that is the target of the FragmentManager transaction. That will do it and you will have the NavDrawer along with the ViewPager. Dont disable anything because it will just work.

see the 'planetfragement' below - just swap in your ViewPager class and it will all work. Remove the planetfragment. Add your ViewPager in its place. that is all u have to do. Your 'viewpager' should be a Fragment that gets a ViewPager and hooks it up to an adapter. It implements the same interface as the Planets in the current sample. just swap it in.

private void selectItem(int position) {
    // update the main content by replacing fragments
    Fragment fragment = new PlanetFragment();
    Bundle args = new Bundle();
    args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
    fragment.setArguments(args);

    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();

    // update selected item and title, then close the drawer
    mDrawerList.setItemChecked(position, true);
    setTitle(mPlanetTitles[position]);
    mDrawerLayout.closeDrawer(mDrawerList);
}

这篇关于onSwipe事件不是ViewPager内触发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆