【问题标题】:Fragment (supported library) doesn't see activity in onActivityCreated(), after screen orientation changed屏幕方向更改后,片段(支持的库)在 onActivityCreated() 中看不到活动
【发布时间】:2012-06-01 16:24:43
【问题描述】:

我正在使用 Android 支持库 v13。有一件奇怪的事情我无法理解。

创建新活动时,我将片段加载为:

主要活动布局:

...
<FrameLayout
    android:id="@+id/fragment_1"
    ... />

onCreate()的主要活动中:

mFragment = (FragmentActivity) getSupportFragmentManager().findFragmentById(R.id.fragment_1);
// if screen orientation changed, no need to create new instance of fragment
if (mFragment == null) {
    mFragment = ...; // create new instance of fragment

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_1, mFragment);
    // because this is called ONCE, we can use this method
    ft.commitAllowingStateLoss();
}

现在,一切都在模拟器 1.5、1.6 和 2.2 中完美运行。我有一部手机2.2.2

但有一个例外:如果应用程序正在运行,并且屏幕方向发生了变化。在onActivityCreated()getActivity() 内部有时会返回null。这只发生在模拟器 1.5/ 1.6/ 2.2 中。

我的手机 2.2.2 运行良好,我测试了数百次,但从未发现该错误。甚至其他模拟器 3.x、4.x 也能正常工作。不幸的是,我没有手机 1.5/ 1.6/ 2.2。

那么你有这方面的经验吗?这是支持库或模拟器的错误吗?

【问题讨论】:

    标签: android android-fragmentactivity android-support-library


    【解决方案1】:

    我相信,更改 Android 设备方向会让人想起您的 onCreate 方法。结果,奇怪的事情往往会发生。您可能会做两件事:

    1- 您可以尝试捕捉方向变化并在那里编写一些代码来尝试防止方向变化导致的问题:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            setContentView(R.layout.main);
            // etc.
    }
    

    2- 或者通过添加:android:screenOrientation="portrait"
    在您的清单中完全防止方向改变 到您的主要活动标签,以阻止此问题再次发生。也就是说,如果您愿意防止方向改变。

    我通常对我的应用使用选项 2,因为方向更改往往会导致各种问题。

    旁注:我看到有人说他们将android:configChanges="orientation|keyboardHidden" 添加到他们的主要活动清单中以解决一些方向问题,所以这可能也值得一试。

    【讨论】:

    • 谢谢。我只是希望我可以保留默认配置(如果用户更改他的屏幕方向,让应用程序按照他的意愿行事)。奇怪的是,这不会发生在较新的模拟器(3.x、4.x)上。
    • 也许在较新版本的 Android 中修复了方向错误?
    • 感谢您的帮助。我意识到我的应用程序中有一些错误。不过,您的信息确实很有帮助。
    • 再次感谢您。您的解决方案帮助了我。
    • 迈克,我想把我所有的代表作为赏金送给你,但我不知道该怎么做。你不知道你刚刚为我节省了多少时间。太感谢了。我被这个问题困扰了好几个星期。当我问这个问题时,我想如果我不问,我会疯掉的。非常感谢……
    【解决方案2】:

    当方向改变时,动作是:

    分离 -> 重新创建视图 -> 附加

    如果附加没有发生,getActivity() 将返回 null。如果您使用的是 FragmentPagerAdapter,则会自动处理此问题。保持对适配器外部片段的引用通常会导致此类问题。

    (片段管理器将继续保留这些引用,并在这些情况下将它们返回给您)。

    【讨论】:

      【解决方案3】:

      使用这些链接作为参考。 Android Memory Leak, no static variablesActivity restart on rotation Android

      我相信这就是您要问的问题。

      【讨论】:

      • 谢谢,对我帮助很大。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多