请参阅下面的更新
我有一个ViewPager
,它的第一页(fragment
)有一个DrawerLayout
,它实现了一个SimpleOnGestureListener
来监听onSwipe
事件。 onSwipe
(片段)中DrawerLayout
事件的目的是在用户滑动到left
和right
时监听,这会触发{{1}的打开和关闭}}。
问题是,到时候,我向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");
}
}
答案 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);
}