我有一个DrawerLayout连接到ActionBar,ActionBarDrawerToggle停止工作。我知道有关为什么它没有打开的问题已被问过100次,但我的问题有点不同。 我的抽屉有效!是的,你点击汉堡包,抽屉就像冠军一样打开和关闭......
当我解除添加到活动中的任何片段时,问题是它停止工作。这是活动布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/renderer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/activity_root_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
...header stuff...
<ViewStub
android:id="@+id/view_stub"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"/>
...footer stuff...
</RelativeLayout>
<FrameLayout
android:id="@+id/left_drawer"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"/>
</android.support.v4.widget.DrawerLayout>
然后活动包含这个......
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
mRendererLayout = (DrawerLayout) findViewById(R.id.renderer_layout);
mDrawerToggle = new ActionBarDrawerToggle(
this,
mRendererLayout,
R.string.alert_ok,
R.string.cancel_all
) {
@Override
public void onDrawerOpened(View drawerView) {
Log.e("===", "RA.Drawer Opened ");
}
@Override
public void onDrawerClosed(View drawerView) {
Log.e("===", "RA.Drawer Closed ");
}
};
mRendererLayout.addDrawerListener( mDrawerToggle );
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.e("===", "RA.onOptionsItemSelected(): ");
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
在几点上,我使用
为活动添加了各种片段addFragment( new MyFragment() );
每个片段都有一个带有调用
的onClick()的视图getActivity().getSupportFragmentManager().popBackStack();
此时抽屉停止工作。片段按预期消失,当点击汉堡包时会记录“RA.onOptionsItemSelected()”但不再记录“RA.Drawer Opened”并且抽屉没有打开。这一直持续到活动重新启动。
为了使事情变得更复杂,活动使用ViewStub来交换两个布局:FrameLayout或包含ViewPager的FrameLayout。只有后者才有问题。我像这样换掉了viewStub ......
ViewStub viewStub = findViewById(R.id.view_stub);
viewStub.setLayoutResource(R.layout.either_layout_here);
viewStub.inflate();
在这种布局中交换抽屉没有任何问题。它通过addFragment():
添加一个片段<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
另一方面,在这种布局中交换有问题......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</FrameLayout>
由于ViewPager处理其片段,因此没有将片段添加到其content_frame(尚未)。这真的是唯一的区别。由于某种原因,弹出片段后退堆栈会破坏ActionBar上的抽屉按钮。
我很难过。救命啊!