回答:
プログラムでフラグメントのIDを設定することはできません。
ただし、String tag
フラグメントを一意に識別するために使用できるFragmentTransaction内に設定できるがあります。
アレクセイが指摘したように、あなたはにIDを渡すことができるFragmentTransaction
のadd(int, Fragment)
方法。ただし、これはフラグメントのIDを指定しません。ViewGroup
を挿入するaのIDを指定しますFragment
。これはFragment
、ViewGroup
sを一意に識別するのではなく、sを識別するため、私があなたが期待している目的にはそれほど役立ちません。これらのIDは、1 つ以上のフラグメントを動的に追加できるコンテナーのものです。そのような方法を使用してを識別するには、挿入するたびにレイアウトに動的にを追加する必要があります。それはかなり面倒です。Fragment
ViewGroup
Fragment
したがって、質問が動的に追加するフラグメントの一意の識別子を作成する方法である場合、答えはFragmentTransaction
のadd(int containerViewId、Fragment fragment、String tag) メソッドとFragmentManager
のfindFragmentByTag(String)メソッドを使用することです。
私のアプリの1つでは、文字列を動的に生成する必要がありました。しかし、いずれにしても、実際のFragmentTransactionに比べてそれほど高価ではありません。
タグメソッドのもう1つの利点は、UIに追加されていないフラグメントを識別できることです。FragmentTransactionのadd(Fragment、String)メソッドを参照してください。Fragment
sは持っている必要はありませんView
!また、構成の変更間で一時的な状態を維持するためにも使用できます。
フラグメント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に保持されている(素晴らしい)フラグメントを取得します。
ほとんどの場合、フラグメントタグとIDを使用できます。
タグの値はで設定できますFragmentTransaction.add(Fragment fragment, String tag );
。次に、コマンドFragmentManager.findFragmentByTag(String tab)
を使用して問題のフラグメントを見つけることができます。
トムと他の人がすでに述べたように、フラグメントにタグを付けて、そのタグを識別に使用する方法があります。これらのソリューションで遭遇したその後の問題は、フラグメントがアクティビティ(または実際にはFragmentManager
)に関連付けられるまでタグを取得できないことです。タグ付けする前にフラグメントを識別する必要がある場合はどうすればよいですか?
これまでの私のソリューションはすべて、世界で最も古い(Java)トリックに依存してgetFragmentId()
います。コンストラクターの1つでIDを取り、そのIDを返すメソッドを提供する最小限のテンプレートフラグメントを作成します。次に、早期の識別が必要なフラグメントにそのテンプレートを拡張させます。出来上がり!問題が解決しました。
このソリューションでは、残念ながら、フラグメントタイプごとに1つListFragment
、DialogFragment
またはFragment
初期の識別が必要なプレーンな古い(POFO ?!)テンプレートフラグメントのセットが必要になる場合があります。しかし、これは、提供される利益を考慮して、フラグメントの場合には管理可能です。
癒しの傷を引き裂いてすみません:-)
乾杯!
以下を使用します。
フラグメントを追加するには:
getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();
既存のフラグメントを識別するには:
getFragmentManager().findFragmentByTag(fragmentName);
タグを使用するときは、必ず
fragmentTransaction.addToBackStack(null);
開発者ガイドに記載されているように、フラグメントが破棄されるのではなく再開されるようにします。
フラグメントを削除するトランザクションを実行するときにaddToBackStack()を呼び出さない場合、トランザクションがコミットされるとそのフラグメントは破棄され、ユーザーはそのフラグメントに戻ることができません。一方、フラグメントを削除するときにaddToBackStack()を呼び出すと、フラグメントは停止し、ユーザーが戻ったときに再開されます。
単純なfindFragmentByTag();
呼び出しでフラグメントが見つからなかった理由を理解しようとして約30分を失いました