我目前正在使用 HC 兼容包使用多窗格 Fragment
化视图测试我的应用程序,并且有很多难以处理的方向更改。
我的Host
活动有 2 个横向窗格(menuFrame
和 contentFrame
(,只有纵向menuFrame
窗格,其中加载了适当的片段。如果我在两个窗格中都有内容,但随后将方向更改为纵向,我会得到一个 NPE,因为它尝试在片段中加载视图,该视图将在(不存在的(contentFrame
中。在内容片段中使用 setRetainState()
方法不起作用。如何解决此问题以防止系统加载不会显示的片段?
非常感谢!
似乎onCreateViewMethod
导致了问题; 如果容器为 null,它必须返回 null:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (container == null) // must put this in
return null;
return inflater.inflate(R.layout.<layout>, container, false);
}
不是理想的答案,但如果您有肖像contentFrame
,并且仅在 savedInstanceState 为空时才加载menuFrame
,那么您的内容帧片段将显示在方向更改时。
虽然不理想,但如果您点击后退按钮(根据需要多次(,那么您将永远不会看到菜单片段,因为它没有加载到contentFrame
中。
遗憾的是,FragmentLayout API 演示没有在方向更改中保留正确的片段状态。无论如何,在考虑了这个问题并尝试了各种事情之后,我不确定是否有一个简单的答案。到目前为止,我想出的最佳答案(未经测试(是在纵向和横向中具有相同的布局,但是当detailsFrame
中有某些内容时隐藏menuFrame
。同样显示它,并在后者为空时隐藏frameLayout
。
仅在首次创建新实例。
这确实可以解决问题:
在以下情况下创建新的片段实例 活动首次启动,否则重用旧片段。
你怎么能做到这一点?
FragmentManager 是关键
以下是代码片段:
if(savedInstanceState==null) {
userFragment = UserNameFragment.newInstance();
fragmentManager.beginTransaction().add(R.id.profile, userFragment, "TAG").commit();
}
else {
userFragment = fragmentManager.findFragmentByTag("TAG");
}
在片段端保存数据
如果您的片段具有 EditText、TextView 或任何其他类变量 要在方向更改时保存。省省吧
onSaveInstanceState()
并在onCreateView()
方法中检索它们
以下是代码片段:
// Saving State
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("USER_NAME", username.getText().toString());
outState.putString("PASSWORD", password.getText().toString());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.user_name_fragment, parent, false);
username = (EditText) view.findViewById(R.id.username);
password = (EditText) view.findViewById(R.id.password);
// Retriving value
if (savedInstanceState != null) {
username.setText(savedInstanceState.getString("USER_NAME"));
password.setText(savedInstanceState.getString("PASSWORD"));
}
return view;
}
您可以在此处查看完整的工作代码