Android-フラグメントIDを設定する


111

どのようにして設定することができますFragmentS」Id私が使用できるようにgetSupportFragmentManager().findFragmentById(R.id.--)


レイアウトxmlファイルで設定できます
Vladimir Eremeev

回答:


117

プログラムでフラグメントのIDを設定することはできません

ただし、String tagフラグメントを一意に識別するために使用できるFragmentTransaction内に設定できるがあります。

アレクセイが指摘したように、あなたはにIDを渡すことができるFragmentTransactionadd(int, Fragment)方法。ただし、これはフラグメントのIDを指定しません。ViewGroupを挿入するaのIDを指定しますFragment。これはFragmentViewGroupsを一意に識別するのではなく、sを識別するため、私があなたが期待している目的にはそれほど役立ちません。これらのIDは、1 つ以上のフラグメントを動的に追加できるコンテナーのものです。そのような方法を使用してを識別するには、挿入するたびにレイアウトに動的にを追加する必要があります。それはかなり面倒です。FragmentViewGroupFragment

したがって、質問が動的に追加するフラグメントの一意の識別子を作成する方法である場合、答えはFragmentTransactionadd(int containerViewId、Fragment fragment、String tag) メソッドとFragmentManagerfindFragmentByTag(String)メソッドを使用することです。

私のアプリの1つでは、文字列を動的に生成する必要がありました。しかし、いずれにしても、実際のFragmentTransactionに比べてそれほど高価ではありません。

タグメソッドのもう1つの利点は、UIに追加されていないフラグメントを識別できることです。FragmentTransactionのadd(Fragment、String)メソッドを参照してください。Fragmentsは持っている必要はありませんView!また、構成の変更間で一時的な状態を維持するためにも使用できます。


フラグメントのIDではなくタグを使用する場合、フラグメントリソースIDを必要とする置換呼び出しをどのように使用しますか?
Namratha 2013年

12
@TomDignan ViewPagerに追加されるフラグメントはどうですか?どうすれば彼のタグを設定できますか?この状況ではトランザクションを使用できません。
GuilhE、2015年

1
@GuilhEアクティビティは、ビューページャーから参照できるaddFragment()メソッドを提供します。それより前にタグを保持することは、ハッシュマップで実現できます。
Thomas Dignan 2015

1
XMLレイアウトでIDを設定できることを強調するために、回答を少し編集できますか?私は個人的に他の質問を読んでおらず、フラグメントにIDを設定する方法がまったくないという印象を受けていました...
Ivan

41

フラグメントIDを知る必要がない場合があります。

ドキュメントから:

public abstract Fragment findFragmentById (int id)

Finds a fragment that was identified by the given id either
when inflated from XML or as the container ID when added in
a transaction.

重要な部分は、「トランザクションに追加されたときのコンテナーIDとして」です。

そう:

getSupportFragmentManager()
    .beginTransaction()
    .add(R.id.fragment_holder, new AwesomeFragment())
    .commit();

その後

AwesomeFragment awesome = (AwesomeFragment)
     getSupportFragmentManager()
          .findFragmentById(R.id.fragment_holder);

R.id.fragment_holderに保持されている(素晴らしい)フラグメントを取得します。


4

ほとんどの場合、フラグメントタグとIDを使用できます。
タグの値はで設定できますFragmentTransaction.add(Fragment fragment, String tag );。次に、コマンドFragmentManager.findFragmentByTag(String tab)を使用して問題のフラグメントを見つけることができます。


2

トムと他の人がすでに述べたように、フラグメントにタグを付けて、そのタグを識別に使用する方法があります。これらのソリューションで遭遇したその後の問題は、フラグメントがアクティビティ(または実際にはFragmentManager)に関連付けられるまでタグを取得できないことです。タグ付けする前にフラグメントを識別する必要がある場合はどうすればよいですか?

これまでの私のソリューションはすべて、世界で最も古い(Java)トリックに依存してgetFragmentId()います。コンストラクターの1つでIDを取り、そのIDを返すメソッドを提供する最小限のテンプレートフラグメントを作成します。次に、早期の識別が必要なフラグメントにそのテンプレートを拡張させます。出来上がり!問題が解決しました。

このソリューションでは、残念ながら、フラグメントタイプごとに1つListFragmentDialogFragmentまたはFragment初期の識別が必要なプレーンな古い(POFO ?!)テンプレートフラグメントのセットが必要になる場合があります。しかし、これは、提供される利益を考慮して、フラグメントの場合には管理可能です。

癒しの傷を引き裂いてすみません:-)

乾杯!


0

以下を使用します。

フラグメントを追加するには:

getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();

既存のフラグメントを識別するには:

getFragmentManager().findFragmentByTag(fragmentName);

回答は質問には関係ありません。回答を更新してください。ハッピーコーディング
CodeWithVikas

-1

タグを使用するときは、必ず

fragmentTransaction.addToBackStack(null); 

開発者ガイドに記載されているように、フラグメントが破棄されるのではなく再開されるようにします。

フラグメントを削除するトランザクションを実行するときにaddToBackStack()を呼び出さない場合、トランザクションがコミットされるとそのフラグメントは破棄され、ユーザーはそのフラグメントに戻ることができません。一方、フラグメントを削除するときにaddToBackStack()を呼び出すと、フラグメントは停止し、ユーザーが戻ったときに再開されます。

これはこのページの最後にあります

単純なfindFragmentByTag();呼び出しでフラグメントが見つからなかった理由を理解しようとして約30分を失いました


-2

トムの回答に加えて、replaceメソッドはaddメソッドに加えてフラグメントタグもサポートします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.