片段(支持库)没有看到onActivityCreated()活动,之后屏幕方向改变(Fragment

2019-09-17 17:07发布

我使用的是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的作品非常好,我试几百次,但从来没有赶上这个bug。 即使是其他仿真3.x中,4.x的工作也很好。 不幸的是我没有电话1.5 / 1.6 / 2.2。

所以,你是否也有这方面的经验? 是支持库,或仿真的一个错误?

Answer 1:

更改Android设备定向回忆你onCreate的方法,我相信。 其结果是,奇怪的事情往往发生。 有两件事情,你可能会做:

1您可以尝试追赶的方向变化,并做一些代码来试图防止这种姿态变更导致的问题:

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

2或防止您的清单共取向变更加入: android:screenOrientation="portrait"
您的主要活动标签,从reoccuring制止这个问题..这就是,如果你愿意,以防止姿态变更。

我通常使用选项2我的应用程序,因为姿态变更往往会造成各种各样的问题。

附注:我见过的人说,他们添加android:configChanges="orientation|keyboardHidden"他们的主要活动的清单,以解决一些麻烦的方向为好,这样,可能是值得一试为好。



Answer 2:

当方向改变时,操作是:

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

如果连接还没有发生,getActivity()将返回一个空。 如果您使用的是FragmentPagerAdapter,这是自动的照顾。 保持适配器以外的片段的引用通常会导致这样的问题。

(片段经理将继续保持引用,并把它们在这些情况下返回到你)。



Answer 3:

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

我相信这是你问什么。



文章来源: Fragment (supported library) doesn't see activity in onActivityCreated(), after screen orientation changed