4

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

我的Host活动有 2 个横向(menuFramecontentFrame)窗格,并且只有menuFrame纵向,加载了适当的片段。如果我在两个窗格中都有一些东西,然后将方向更改为纵向,我会得到一个 NPE,因为它试图在 (non-existent) 中的片段中加载视图contentFrame。使用setRetainState()内容片段中的方法不起作用。我该如何解决这个问题以防止系统加载不会显示的片段?

非常感谢!

4

3 回答 3

3

似乎onCreateViewMethod是引起了问题;如果容器为空,它必须返回空:

@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);
}
于 2011-08-10T15:29:44.117 回答
0

可能不是理想的答案,但如果您有contentFrame肖像并且在您的活动中仅menuFrame在 savedInstanceState 为空时加载,那么您的内容框架片段将在方向更改时显示。

虽然不理想,但如果您点击后退按钮(根据需要多次),那么您将永远不会看到菜单片段,因为它没有加载到contentFrame.

遗憾的是,FragmentLayout API 演示没有在方向更改时保留正确的片段状态。无论如何,在考虑过这个问题并尝试了各种事情之后,我不确定是否有一个简单的答案。到目前为止,我想出的最佳答案(未经测试)是纵向和横向具有相同的布局,但menuFramedetailsFrame. 同样显示它,frameLayout当后者为空时隐藏。

于 2011-06-06T14:22:18.940 回答
0

仅为第一次创建新实例。

这可以解决问题:
在活动第一次启动时创建一个新的片段实例,否则重用旧片段。
你怎么能做到这一点?
FragmentManager是关键

这是代码片段:

if(savedInstanceState==null) {
    userFragment = UserNameFragment.newInstance();
    fragmentManager.beginTransaction().add(R.id.profile, userFragment, "TAG").commit();
}
else {
    userFragment = fragmentManager.findFragmentByTag("TAG");
}

在 Fragment 端保存数据

如果您的片段有 EditText、TextViews 或您想要在方向更改时保存的任何其他类变量。保存 并在方法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;
}

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

于 2018-12-31T15:06:44.357 回答