屏幕方向改变后,片段(支持的库)在onActivityCreated()中看不到活动

时间:2012-06-01 16:24:43

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

我正在使用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。

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

3 个答案:

答案 0 :(得分:3)

我相信更改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"以解决一些定位问题,所以这也值得一试。

答案 1 :(得分:1)

当方向发生变化时,操作为:

分离 - &gt;重新创建视图 - &gt;附

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

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

答案 2 :(得分:0)

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

我相信这就是你所要问的。