DrawerLayout перестает работать, когда задний стек фрагментов выталкивается
У меня 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, либо FrameLayout, содержащего ViewPager. Только у последнего есть проблема. Я поменял 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>
Этот элемент не получает фрагмент, добавленный к его content_frame (пока), так как ViewPager обрабатывает его фрагменты. Это действительно единственная разница. По какой-то причине возврат фрагмента обратно в стек ломает кнопку ящика на панели действий.
Я в тупике. Помогите!