【发布时间】:2015-10-23 21:03:05
【问题描述】:
我设置了一个非常简单的测试项目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。但是,当显示对话框并且用户转到第二级片段并旋转屏幕时,我得到以下异常:
E/AndroidRuntime: java.lang.RuntimeException: 无法启动活动 组件信息{de.azzoft.viewpagerdialogtest/de.azzoft.viewpagerdialogtest.MainActivity}: java.lang.IllegalArgumentException:没有为 id 0x7f0c0083 找到视图 (de.azzoft.viewpagerdialogtest:id/root_frame) 用于片段 SecondLevelFragment{15c0db38 #0 id=0x7f0c0083 NESTED}
E/AndroidRuntime: 引起: java.lang.IllegalArgumentException: 否 找到 id 0x7f0c0083 的视图 (de.azzoft.viewpagerdialogtest:id/root_frame) 用于片段 SecondLevelFragment{15c0db38 #0 id=0x7f0c0083 NESTED}
完整的堆栈跟踪:https://github.com/ArtworkAD/ViewPagerDialogTest/blob/master/README.md
如果没有出现对话框,一切都会很好。您可以通过下载测试项目来测试它。
看起来实际上是一个片段的对话框在添加到活动时会弄乱片段层次结构。任何想法如何解决这个问题?
保留第二个片段很重要。
【问题讨论】:
-
我正在努力修复它
-
你可以试试this solution
-
@Yvette 应该保留“SecondLevelFragment”。嵌套可能是错误的说法,更好的是:添加在“FirstLevelFragment”之上。但实际上如果你看一下代码你就会明白。
标签: android android-fragments android-viewpager android-support-library