1

我有一个使用停止工作的 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 上的抽屉按钮。

我难住了。帮助!

4

0 回答 0