使用片段处理方向更改



我目前正在使用 HC 兼容包使用多窗格 Fragment 化视图测试我的应用程序,并且有很多难以处理的方向更改。

我的Host活动有 2 个横向窗格(menuFramecontentFrame (,只有纵向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;
}

您可以在此处查看完整的工作代码

最新更新