您好我创建了一个默认的“导航抽屉活动”项目。 所以我有一个MainActivity,其中一个片段被替换为菜单上的每个项目。
其中一个菜单是“客户”,其中显示了客户列表。
从客户片段我可以看到这个客户的兴趣,是一个调用兴趣的片段(CustomerListFragment)(InterestsListFragment)。
还有更多级别,但要做得足够短。
这是MainActivity上的代码,用于从片段调用片段并在
之间传递数据public void passData(Object[] data, Fragment f) {
Bundle args = new Bundle();
args.putSerializable("PASSED_DATA", data);
f.setArguments(args);
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, f)
.addToBackStack("")
.commit();
}
我用的是:
mCallbacks.passData(new Object[]{c}, new OpportunityListFragment());
问题在于,当我旋转手机与我所拥有的活动水平无关时,它会回到第一个称为(CustomerListFragment)的片段,如果我在手机上点击“返回”,它会回到我所在的位置是我旋转手机的时候。
我该怎么做才能避免这种问题?如果我要替换片段,它会回到第一个被激活的活动吗?
答案 0 :(得分:4)
ste-fu的答案是正确的,但让我们以编程方式进行探索。 Google文档@ Handling Runtime Changes中有一个很好的工作代码。您需要执行2个代码段。
1)代码段:
public class MyActivity extends Activity {
private RetainedFragment dataFragment;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// find the retained fragment on activity restarts
FragmentManager fm = getFragmentManager();
dataFragment = (DataFragment) fm.findFragmentByTag(“data”);
// create the fragment and data the first time
if (dataFragment == null) {
注意:代码使用 FragmentManager 来查找当前的片段。如果fragment为null,则表示UI或app尚未执行。如果不为null,则可以从 RetainedFragment 对象获取数据。
2)需要保留Fragment状态。
public class RetainedFragment extends Fragment {
// data object we want to retain
private MyDataObject data;
// this method is only called once for this fragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
}
注意:在OnCreate中使用 setRetainInstance 。建议对子片段进行子类化,并将其命名为 RetainedFragment ,在片段1上使用。
答案 1 :(得分:1)
更改屏幕方向时,您的父活动将被销毁并重新创建。除非您以某种方式保持关卡结构,否则它将始终显示为您第一次启动活动时。您可以使用捆绑包对象,也可以将更复杂的对象保存到数据库中。
无论哪种方式,onSaveInstanceState都是你的朋友。然后在onCreate方法中,您需要检查包或数据库,并相应地设置片段。