我设置了一个非常简单的测试项目https://github.com/ArtworkAD/ViewPagerDialogTest https://github.com/ArtworkAD/ViewPagerDialogTest评估以下情况:主要活动有一个视图分页器,它使用支持片段管理器托管单个片段:
public class MainActivity extends AppCompatActivity {
// ...
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
viewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));
// ...
tabLayout.setupWithViewPager(viewPager);
}
@Override
protected void onResume() {
super.onResume();
MainActivity.CustomDialog dialog = (MainActivity.CustomDialog) getSupportFragmentManager().findFragmentByTag(MainActivity.CustomDialog.TAG);
if (dialog == null) {
new MainActivity.CustomDialog().show(getSupportFragmentManager().beginTransaction(), MainActivity.CustomDialog.TAG);
}
}
// ...
}
当活动恢复时,主活动内会显示一个对话框片段。
视图分页器内的单个片段定义如下:
public class RootFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.root_fragment, container, false);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction().add(R.id.root_frame, new FirstLevelFragment(), "ROOT").commit();
}
return root;
}
}
这个根片段允许我们在“root_frame”上堆叠其他片段。所以我们堆叠一个又一个:
public class FirstLevelFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setRetainInstance(true);
View root = inflater.inflate(R.layout.first_level_fragment, container, false);
root.findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SecondLevelFragment f = (SecondLevelFragment) getActivity().getSupportFragmentManager().findFragmentByTag("NESTED");
if (f == null) {
getActivity().getSupportFragmentManager().beginTransaction().add(R.id.root_frame, new SecondLevelFragment(), "NESTED").addToBackStack(null).commit();
}
}
});
return root;
}
public static class SecondLevelFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setRetainInstance(true);
return inflater.inflate(R.layout.second_level_fragment, container, false);
}
}
}
这太棒了!堆叠的想法取自https://stackoverflow.com/a/21453571/401025 https://stackoverflow.com/a/21453571/401025。但是,当显示对话框并且用户转到第二级片段并旋转屏幕时,我收到以下异常:
E/AndroidRuntime:java.lang.RuntimeException:无法启动活动
ComponentInfo{de.azzoft.viewpagerdialogtest/de.azzoft.viewpagerdialogtest.MainActivity}:
java.lang.IllegalArgumentException:找不到 id 0x7f0c0083 的视图
(de.azzoft.viewpagerdialogtest:id/root_frame) 片段
SecondLevelFragment{15c0db38 #0 id=0x7f0c0083 嵌套}
E/AndroidRuntime:由以下原因引起:java.lang.IllegalArgumentException:否
找到 id 0x7f0c0083 的视图
(de.azzoft.viewpagerdialogtest:id/root_frame) 片段
SecondLevelFragment{15c0db38 #0 id=0x7f0c0083 嵌套}
完整的堆栈跟踪:https://github.com/ArtworkAD/ViewPagerDialogTest/blob/master/README.md https://github.com/ArtworkAD/ViewPagerDialogTest/blob/master/README.md
如果没有出现对话框,一切都会很好。您可以通过下载测试项目进行测试。
看起来对话框实际上是一个片段,当它添加到活动中时,它会弄乱片段层次结构。任何想法如何解决这一问题?
保留第二个片段很重要。