onSwipe事件不在ViewPager中触发

时间:2013-08-10 03:27:57

标签: java android android-fragments android-viewpager drawerlayout

请参阅下面的更新 我有一个ViewPager,它的第一页(fragment)有一个DrawerLayout,它实现了一个SimpleOnGestureListener来监听onSwipe事件。 onSwipe(片段)中DrawerLayout事件的目的是在用户滑动到leftright时监听,这会触发{{1}的打开和关闭}}。 enter image description here

问题是,到时候,我向drawer ViewPager的页面更改,而不是触发left or right的打开和关闭。

是否可以暂时停用滑动Drawer,同时当前视图位于ViewPager,以便它可以收听左右事件?

如果抽屉打开,如果我向右滑动屏幕,那就是页面更改的时间。我几天都在努力解决这个问题。

我可以在DrawerLayout吗?

DrawerLayoutFragment

抽屉

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

onSwipe of `DrawerLayoutFragment`  is triggered

更新 - 这是我到目前为止所得到的。我有一个具有子ViewPager(片段)的父ViewPager,我无法处理子ViewPager 的刷卡,因为父对象总是被刷过而没有给孩子一个机会。抽屉正在工作,就像我按住屏幕左侧一秒钟然后向右拖动它一样。如上图所示。

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");

    }

}

1 个答案:

答案 0 :(得分:1)

获取演示NavDrawer here

如果您在示例代码中给出的行星选择框架交换ViewPager实现,它将正常工作。

详细说明:

'selectItem'中的

只是在'fragment'对象中得到一个ViewPager,它是FragmentManager事务的目标。这样做会让你和NavDrawer一起使用ViewPager。不要禁用任何东西,因为它会起作用。

请参阅下面的'planetfragement' - 只需交换ViewPager类,它就会全部工作。删除Planetfragment。将ViewPager添加到其位置。这就是你要做的一切。你的'viewpager'应该是一个获取ViewPager并将其连接到适配器的片段。它实现了与当前样本中的行星相同的接口。只需交换它。

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);
}