【问题标题】:ViewPager Fragments getting destroyed while app is in background?应用程序在后台时 ViewPager 片段被破坏?
【发布时间】:2014-10-22 02:41:14
【问题描述】:

我一生都无法弄清楚为什么有时在我的应用启动、暂停和恢复后,我的 Fragments 变得无法控制。

我持有这样的片段引用:

public class MainActivity ... {

    public static AccountFragment accountFragment;
    ....

    @Override
    protected void onCreate( ... {

        accountFragment = new AccountFragment(this);
        ...
    }

我有一个带有 Spinner 的自定义工具栏,理论上应该允许用户在 AccountFragment 中运行 AsyncTask。这是这样实现的:

if (accountFragment.getView() != null) {

    accountFragment.load()
}

然后我创建一个 ViewPager、一个 FragmentPagerAdapter 等。

这在大多数情况下都可以正常工作。用户可以在 Spinner 中选择一个新项目,AccountFragment 将相应更新。但是,有时在应用程序停止后又恢复后,AccountFragment 根本不会响应任何内容。即使应用程序中应该影响 AccountFragment 的其他视图也是无用的。这对我来说毫无意义,因为 AccountFragment 的视图不能为空,并且由 accountFragment.load() 执行的 AsyncTask 对其 onPreExecute 中的 UI 进行了一些非常简单的更改,这应该非常明显(例如,一切都消失了,并且出现了 ProgressBar ) 这根本没有发生。

有什么想法吗?

【问题讨论】:

    标签: android android-fragments android-viewpager android-fragmentactivity onpause


    【解决方案1】:

    没有足够的代码来确切知道这里出了什么问题,但也有一堆你做错的事情。

    1) 不要将片段引用存储在 public static 字段中。最多只是private,或protected。阅读基本的 Java 手册以获得解释。

    2) 不要重载 Fragment 的构造函数,这在设计上是不鼓励的。如果您需要向它传递一些值,请使用参数来完成。

    3) 我猜你没有在 Activity 的onCreate() 方法期间执行检查,如果它正在重新创建或新创建。您最终可能会得到两个 AccountFragment 实例,其中一个处于某种奇怪的分离状态。

    ...

    您可能应该花更多时间研究有关 Fragment/Activity 关系的基础知识以及如何避免此类情况。

    【讨论】:

    • 感谢您的全面回答! 1:好的,我会这样做的。 2:我的片段需要以某种方式引用我的 MainActivity。那还应该怎么做? 3:如何判断 onCreate 是重新创建还是新创建?如果我发现它正在被重新创建,我会有什么不同的做法?
    • 您的片段有 getActivity() 方法。您可以将返回的 Activity 投射到 MainActivity。关于重新创建:如果 onCreate() 方法中的 savedInstanceState 为 null,则通常表示 Activity 是新创建的。如果它不为空,它正在重新创建。
    • 您是否认为用以下 if 块围绕我的片段实例化可能有效? if (savedInstanceState == null) { // 实例化片段 }
    • 这绝对是一个更好的方法,但是如果没有其余的代码,我真的不能说它会解决所有问题
    【解决方案2】:

    你需要的是重写这些方法:

    onSaveInstanceState(){}
    onCreate (Bundle savedInstanceState){}
    or onCreateView()
    

    http://developer.android.com/reference/android/app/Fragment.html#onSaveInstanceState(android.os.Bundle)。您将捆绑所需的所有参数放入 onSaveInstanceState() 并在 onCreate() 或 onCreateView() 中恢复它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多