我正在使用带有TabLayout的ViewPager,其中我有5页。在第3页的片段中,我有一个FramLayout,我在其中创建页面时添加默认片段。现在默认片段上有一个按钮,用另一个片段替换默认片段,并在backstack中添加带有标记的事务。
问题: 用新的替换默认片段之后我可以按下后退按钮并恢复默认片段,但是如果我更改选项卡说第一个没有恢复默认片段并按下第一个选项卡上的后退按钮,则应用程序崩溃。
记录:
java.lang.IllegalArgumentException: No view found for id 0x7f1001c7 (com.xyz.android:id/manage_workers_main_container) for fragment ManageWorkersFragment{1902e37 #5 id=0x7f1001c7}
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1293)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
at android.support.v4.app.BackStackRecord.executePopOps(BackStackRecord.java:807)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2360)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149)
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2013)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:710)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:5527)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
ManageWorkerFragment.class
该片段只包含一个从onCreateView()
方法调用的函数。
private void setUpViewPager() {
tabLayout.addTab(tabLayout.newTab().setTag("Fragment1"));
tabLayout.addTab(tabLayout.newTab().setTag("Fragment2"));
tabLayout.addTab(tabLayout.newTab().setTag("Fragment3"));
manageWorkerPagerAdapter = new ManageWorkerPagerAdapter(getChildFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(manageWorkerPagerAdapter);
tabLayout.setupWithViewPager(viewPager);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
Fragment childFragment;
if (tab.getPosition() == 0) {
childFragment = getFragmentManager().findFragmentById(R.id.fragment1_container);
if ((childFragment instanceof Fragment1))
((Fragment1) childFragment).setMyKeyListener();
} else if (tab.getPosition() == 1) {
childFragment = getFragmentManager().findFragmentById(R.id.fragment2_container);
if ((childFragment instanceof Fragment2))
((Fragment2) childFragment).setMyKeyListener();
} else if (tab.getPosition() == 2) {
childFragment = getFragmentManager().findFragmentById(R.id.fragment3_container);
if ((childFragment instanceof Fragment3))
((Fragment3) childFragment).setMyKeyListener();
}
}
});
tabLayout.getTabAt(0).setText("Fragment1");
tabLayout.getTabAt(1).setText("Fragment2");
tabLayout.getTabAt(2).setText("Fragment3");
viewPager.setOffscreenPageLimit(tabLayout.getTabCount());
}
注意:我无法在onBackPressed()活动方法中使用super.onBackPressed()
方法,因为我正在为内部片段处理一些片段导航
在使用onKeyDown()的不同选项卡中,当backstack中只有一个条目时,我还在onBackPressed()活动方法中显示了一个退出构造对话框。