使用片段处理方向更改

时间:2011-05-28 21:05:14

标签: android android-3.0-honeycomb android-fragments

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

我的Host活动在横向(menuFramecontentFrame)中有2个窗格,纵向只有menuFrame,加载了适当的片段。如果我在两个窗格中都有某些内容,但随后将方向更改为纵向,则会尝试加载NPE,因为它会尝试加载(不存在的)contentFrame中的片段中的视图。在内容片段中使用setRetainState()方法不起作用。如何对此进行排序以防止系统加载无法显示的片段?

非常感谢!

3 个答案:

答案 0 :(得分:3)

似乎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);
}

答案 1 :(得分:0)

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

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

遗憾的是,FragmentLayout API演示不会在方向更改中保留正确的片段状态。无论如何,考虑到这个问题,尝试了各种各样的事情,我不确定是否有一个直截了当的答案。到目前为止,我提出的最佳答案(未经测试)是在纵向和横向上使用相同的布局,但在menuFrame中存在某些内容时隐藏detailsFrame。同样地显示它,并在后者为空时隐藏frameLayout

答案 2 :(得分:0)

仅首次创建新实例。

  

这可以解决问题:
        创建新的Fragment实例时,   活动是第一次开始,否则请重用旧片段。
  怎么办呢?
   FragmentManager 是关键

以下是代码段:

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

在片段一侧保存数据

  

如果您的片段具有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;
}

您可以看到完整的工作代码HERE