我有一个使用停止工作的 ActionBarDrawerToggle 连接到 ActionBar 的 DrawerLayout。我知道为什么它不打开的问题已经被问了 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”且抽屉未打开。这种情况一直持续到活动重新启动。
为了让事情变得更复杂,Activity 使用 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 上的抽屉按钮。
我难住了。帮助!