4

私はこれについて本当に混乱しています。actionbarリストナビゲーション付きです。リストをクリックして2fragmentつを次々に開き、同じアクティビティに表示します。私は基本的にこの方法を使用してそれらを置き換えています:

public void openFragment(AprilAppsFragment createdFragment){        
    if (createdFragment.getClass().isInstance(getDisplayedFragment()))
        return;

    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

    transaction.replace( R.id.main_fragment, createdFragment, "displayed fragment"); 
    transaction.addToBackStack(null);
    transaction.commit();  
}

フラグメントAを開き、次にフラグメントBを開き、次に画面を回転させます。フラグメントAが再作成され、アプリがクラッシュします

私がreplaceを使用しているのに、それはなぜですか?表示されなくなったフラグメントを、バックプレスの可能性を失うことなく再作成しないようにするにはどうすればよいですか?

4

5 に答える 5

9

問題は、フラグメントの状態を保存しておらず、追加していないためです。

android:configChanges="orientation|screenSize"

最初のフラグメントが再度呼び出され、保存された状態がないため、アプリがクラッシュします。したがって、マニフェストのアクティビティ宣言に上記の行を次のように追加するのは良いことです。

<activity android:name=".yourActivity" android:configChanges="orientation|screenSize"

onSaveInstanceStateをオーバーライドし、両方のフラグメントの状態を保存します。そして、onCreateで次のチェックを行ってください。

if(savedInstanceState != null){
fragmentA = (FragmentA) fragmentManager.getFragment(savedInstanceState, stringValueA);
fragmentB = (FragmentB) fragmentManager.getFragment(savedInstanceState, stringValueB);
}

次に、インスタンスを作成してfragmentTransaction.relplaceに設定するよりも、フラグメントのいずれかがnullでないかどうかを確認します。または、openFragmentメソッドでこれを実行します。

乾杯、

于 2013-03-08T01:32:50.450 に答える
2

問題は、アクティビティが再作成されているため、リストナビゲーションが再設定され、デフォルトの(最初の)位置がトリガーされることです。アクティビティの破棄とアクティビティの再作成の間で、選択したインデックスを保存する必要があります。次に例を示します。

@Override
public void onCreate(Bundle savedInstanceState) {

    // onCreate implementation...

    // Must come after setListNavigationCallbacks is called
    if (savedInstanceState != null) {
        int index = savedInstanceState.getInt("index");
        getActionBar().setSelectedNavigationItem(index);
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {

    super.onSaveInstanceState(outState);
    outState.putInt("index", getActionBar().getSelectedNavigationIndex());
}
于 2013-03-07T07:13:46.793 に答える
2

フラグメントは、ローテーション時にその状態(およびバックスタック上の位置)を自動的に保存します。onActivityCreatedまたはonCreateメソッドでフラグメントを再作成したり、openFragmentを呼び出したりしていないことを確認してください。

于 2013-02-25T19:13:35.533 に答える
1

私は同様の問題を抱えていました、そして私がすることは私のAndroidmanifest.xmlにコード行を追加することです(あなたが再作成を止めたいあなたの活動の中に):

android:configChanges = "orientation"

そしてもう1つ、フラグメントは一種のサブアクティビティであり、アクティビティではないことを学びました。フラグメントでサポートを取得するには、アクティビティフラグメントを拡張する必要があります。アクティビティフラグメントを拡張するアクティビティは、実際に保持するアクティビティです。フラグメントと呼ばれる「サブのアクティビティ」。

私はあなたを助けることを願っています...

于 2013-03-04T23:43:29.963 に答える
1

これをAndroidManifest.xmlファイルのアクティビティ定義に追加します。

android:configChanges="keyboardHidden|screenLayout|orientation|screenSize"

これにより、アクティビティが再起動せず、FragmentManagerが持っているフラグメントを自動的に再作成できなくなります。

ローテーションで再開するアクティビティが必要な場合は、onCreateに渡されているsavedInstanceStateを探してから、指定したタグを使用してフラグメントのFragmentManagerにクエリを実行する必要があります。

于 2013-03-06T20:18:04.813 に答える