我目前正在使用HC兼容性软件包使用多窗格Fragment
- ised视图测试我的应用,并且有很多难以处理的方向更改。
我的Host
活动在横向(menuFrame
和contentFrame
)中有2个窗格,纵向只有menuFrame
,加载了适当的片段。如果我在两个窗格中都有某些内容,但随后将方向更改为纵向,则会尝试加载NPE,因为它会尝试加载(不存在的)contentFrame
中的片段中的视图。在内容片段中使用setRetainState()
方法不起作用。如何对此进行排序以防止系统加载无法显示的片段?
非常感谢!
答案 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