48

Honeycomb でアプリを開発し、フラグメントを使用しています。
これは私のアプリです

  • 私はアクティビティ(たとえばA1)を持っており、その中にフラグメントがあります
  • 最初に、このフラグメントはオブジェクトを 1 つのフラグメント オブジェクトとして保持します (F1)
  • 次に、ユーザーのアクションに応じて、他のオブジェクト F2、F3 に変更される場合があります ....

私の問題は何ですか

ユーザーがデバイスを回転させると、アクティビティが再作成され、F1 をフラグメント オブジェクトとして作成しますが、回転する前は 使用していませんでしたが、機能しませんでした。このように、関数 にコードでフラグメントを追加しました。
What is the way to retain the fragment object while rotating?
setRetainInstance(true);
onCreate

@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);

   FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();

   Fragment homeFragment = new Home();
   fragmentTransaction.add(R.id.mainFragement, homeFragment);
   fragmentTransaction.commit();
}
4

6 に答える 6

69

デフォルトでは、Androidはフラグメントオブジェクトを保持します。コードでは、関数にを設定しhomeFragmentていますonCreate。だからこそ、あなたが設定したのは常にいくつかhomeFragmentまたは何でもです。flonCreate

回転するたびに、onCreateが実行され、フラグメントオブジェクトが最初のオブジェクトに設定されるためです。

したがって、簡単な解決策は、savedInstanceStateバンドルがnullかどうかを確認し、フラグメントオブジェクトを設定することです。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(null == savedInstanceState) {
        // set you initial fragment object 
    }
 }
于 2011-03-02T08:14:52.130 に答える
41

フラグメントに一意のタグを付け、このフラグメントがすでにアクティビティに追加されているかどうかを確認する必要があります。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    String tag = "my_fragment";
    FragmentManager fragmentManager = getFragmentManager();
    if(fragmentManager.findFragmentByTag(tag) == null) {
        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        Fragment homeFragment = new Home();
        fragmentTransaction.add(R.id.mainFragement, homeFragment, tag);
        fragmentTransaction.commit();
    }
}

nullかどうかsavedInstanceStateを確認することは、フラグメントがすでに設定されているかどうかを確認する安全な方法ではありません-ほとんどの場合は機能しますが、場合によっては(デバイスのメモリが少ない場合など)、Androidがアクティビティを強制終了する可能性があります。あなたの申請。

これが実際に動作していることを確認するには、デバイスの開発オプションで[アクティビティを保持しない]にチェックマークを付けます(この設定はAndroid 4.0以降で利用できますが、以前のバージョンについてはわかりません)。新しいアクティビティを開くと、最初のアクティビティは破棄されます。(押し戻すことによって)それに戻ると、それは再び作成され、savedInstanceStateはnullではありません。ただし、フラグメントはもうアクティビティに含まれていないため、再度追加する必要があります。

編集-元の原則を示していますが、SupportFragmentManagerを使用しています

public class ActivityAwesome extends AppCompatActivity
{
    private final String TAG = getClass().getSimpleName();
    private FragmentHome mHomeFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layout);

        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fragment = fragmentManager.findFragmentByTag(TAG);
        if(fragment == null)
        {
            // Create the detail fragment and add it to the activity using a fragment transaction.
            mHomeFragment = new FragmentHome();
            fragmentManager.beginTransaction()
                    .add(R.id.fragment_container, mHomeFragment, TAG)
                    .commit();
        }
        else
        {
            // get our old fragment back !
            mHomeFragment = (FragmentHome)fragment;
        }
    }
}

mHomeFragmentこれは、デバイスを回転させた後にフラグメント(この場合)を操作する場合に特に便利です。

于 2012-11-02T09:44:52.510 に答える
0

Fragmentアクティビティのレイアウトでを定義しましたがonSaveInstanceStateFragmentは呼び出されますがsavedInstanceState Bundle、フラグメントのonCreatViewは null になります。

その理由はFragment、XML に ID が含まれていなかったためです。

android:id="@+id/compass_fragment" ...
于 2013-04-13T23:23:54.817 に答える
-1

フラグメント クラスRetainInstance内でプロパティを設定するだけです。OnCreate

public override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    RetainInstance = true;
}

回転中に Fragment オブジェクトを保持する

于 2018-04-26T20:40:30.467 に答える