【问题标题】:Fragment calling fragments loosing state on screen rotation片段调用片段在屏幕旋转时丢失状态
【发布时间】:2015-03-25 17:36:43
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    ste-fu 的答案是正确的,但让我们以编程方式进行探索。 Google 文档@Handling Runtime Changes 中有一个很好的工作代码。您必须执行 2 个代码 sn-ps。

    1) 代码sn-p:

    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。如果 fragment 为 null,则 UI 或应用程序尚未执行。如果不为 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);
    }
    

    注意:setRetainInstance 在 OnCreate 中使用。并且建议对 Fragment 进行子类化,将其命名为 RetainedFragment,用于 sn-p 1。

    【讨论】:

      【解决方案2】:

      当您更改屏幕方向时,您的父 Activity 将被销毁并重新创建。除非您以某种方式保持关卡结构,否则它将始终显示为您第一次开始活动时的样子。您可以使用 bundle 对象,或者对于更复杂的对象,您需要将其持久化到数据库中。

      无论哪种方式,onSaveInstanceState 都是您的朋友。然后在您的 onCreate 方法中,您需要检查包或数据库,并相应地设置片段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-11
        • 1970-01-01
        • 2016-01-04
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        • 1970-01-01
        • 2012-01-04
        相关资源
        最近更新 更多