片段调用片段在屏幕旋转时失去状态

时间:2015-03-25 17:36:43

标签: android android-fragments navigation-drawer screen-rotation

您好我创建了一个默认的“导航抽屉活动”项目。 所以我有一个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)的片段,如果我在手机上点击“返回”,它会回到我所在的位置是我旋转手机的时候。

我该怎么做才能避免这种问题?如果我要替换片段,它会回到第一个被激活的活动吗?

2 个答案:

答案 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方法中,您需要检查包或数据库,并相应地设置片段。