弹出片段后端堆栈时,DrawerLayout停止工作

时间:2018-06-13 21:14:04

标签: android android-fragments drawerlayout viewstub

我有一个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上的抽屉按钮。

我很难过。救命啊!

0 个答案:

没有答案