30

Android では、FragmentTransaction で Fragment のタグを設定できます。

フラグメントにタグを設定する必要があるのはなぜですか?

フラグメントがそのタグに基づいて動作を変更した場合、それは良い習慣ですか?

4

2 に答える 2

33

フラグメント タグを使用してFragmentActivity向きの変更を再作成することを回避できます。

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

    MyFragment fragment;
    if (savedInstanceState != null) {
        fragment = (MyFragment) getFragmentManager()
            .findFragmentByTag("my_fragment_tag");
    } else {
        fragment = new MyFragment();
        fragment.setArguments(getIntent().getExtras());
        getFragmentManager()
            .beginTransaction()
            .add(android.R.id.content, fragment, "my_fragment_tag")
            .commit(); 
    }
}

Activity向きが変わると再作成され、そのonCreate(...)メソッドが呼び出されます。Fragmentが破棄される前に が作成され、タグでActivityに追加された場合、同じタグでFragmentManagerから取得できるようになりました。FragmentManager

使用方法に関するより長い議論については、次を参照してください。

于 2012-11-22T10:27:09.263 に答える
2

非 UI フラグメントの場合:

フラグメントにタグを設定する必要があるのはなぜですか?

Fragmentは、 によってバックグラウンド ワーカーとして使用されることがありますActivity。このようなフラグメントには UI がなく、非 UI フラグメントとも呼ばれます。このString tagフラグメントを識別する唯一の方法です。このフラグメントを追加するには、add(Fragment, String)をとらないメソッドを使用しますView Id。例えば:

FragmentManager fm = getFragmentManager();
workFragment.setTargetFragment(this, 0);
fm.beginTransaction().add(workFragment, "work").commit();

その後、このフラグメントの使用への参照を取得するには、

workFragment = (WorkFragment)fm.findFragmentByTag("work");

参照を使用して、UI フラグメントworkFragment内のこのフラグメントのすべてのメソッドにアクセスできます。非 UI フラグメントの完全な例を次に示しますActivity


UI を含むフラグメントの場合:

フラグメントがそのタグに基づいて動作を変更した場合、それは良い習慣ですか?

Activityタグの使用からフラグメントの動作を変更しなければならない状況があります。そうしても問題ないはずです。この方法を使用しているオープン ソース アプリをいくつか見てきました。基本的に、文字列タグをフラグメントに提供します。FragmentManagerこれは、後で簡単に検索できるように、 内のフラグメントにタグを付けるために使用されます。からその動作を変更またはアクセスしますActivity

例: ユーザーがSettingsActivityからMainActivityに切り替え、設定を変更し、戻るボタンを押して MainActivity に戻ります。MainActivity#onResume() で設定の変更を検出し、新しい設定に従って現在のフラグメントの動作を更新または変更できます。

FragmentManager fm = getFragmentManager();
uiFragment = (UiFragment) fm.findFragmentByTag("ui");
uiFragment.fetchNewData();
uiFragment.displayNewData();
于 2016-04-15T20:29:27.797 に答える