2

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

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

4

3 回答 3

3

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

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

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

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

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

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

于 2012-06-01T16:27:20.433 回答
1

当方向改变时,动作是:

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

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

(片段管理器将继续保留参考资料,并在这些情况下将它们归还给您)。

于 2012-07-13T10:56:54.767 回答
0

使用这些链接作为参考。 Android 内存泄漏,没有静态变量Activity 在旋转时重启 Android

我相信这就是你要问的。

于 2012-06-01T16:37:29.880 回答