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

Android デバイスの向きを変更すると、あなたのonCreate方法が思い出されると思います。その結果、奇妙なことが起こりがちです。潜在的に実行できることが 2 つあります。

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 を使用している場合、これは自動的に処理されます。フラグメントへの参照をアダプターの外部に保持すると、通常、このような問題が発生します。

(Fragment Manager は引き続き参照を保持し、これらの場合にはそれらを返します)。

于 2012-07-13T10:56:54.767 に答える
0

これらのリンクを参照として使用してください。 Androidのメモリリーク、静的変数なし、ローテーション時にアクティビティが再開Android

これがあなたが求めていることだと思います。

于 2012-06-01T16:37:29.880 に答える