59

xml レイアウトでフラグメントの ID を定義しています。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/test_fragment"
...

次に、このフラグメントをアクティビティの onCreate メソッドに追加します。

MyFragment myFragment = new MyFragment();
fragmentTransaction.add(R.id.fragment_container, myFragment);
fragmentTransaction.commit();

これはすべて正常に機能しています。フラグメントの交換も機能しています。

後で、アクティビティのメソッドの 1 つで、ID でこのフラグメントを取得しようとしています。

MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentById(R.id.test_fragment);

そうすることで、 myFragment が になりnullます。いつも。

ID の代わりにタグで同じことをしようとすると、問題なくタグでフラグメントを取得できます。

MyFragment myFragment = new MyFragment();
fragmentTransaction.add(R.id.fragment_container, myFragment, "testfragment");
fragmentTransaction.commit();

...

MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentByTag("testfragment");

findFragmentById ではフラグメントを見つけられないのに、findFragmentByTag では見つけられるのはなぜですか? 何か不足していますか?

4

9 に答える 9

44

R.id.test_fragmentフラグメントのIDではなく、LinearLayoutのIDです

呼び出すadd(int containerViewId, Fragment fragment)と、タグなしのフラグメントが追加されます。つまり、を使用add(int containerViewId, Fragment fragment, String tag)して、タグを使用して(IDとして)フラグメントを取得します。

于 2012-05-31T12:37:21.717 に答える
9

<FrameLayout>タグをレイアウト ファイルのコンテナとして使用します。後でアクティビティのフラグメントを動的に置き換えるために、<FrameLayout>コンテナの ID を使用してアクティビティのフラグメントを置き換えることができます。

<FrameLayout
            android:id="@+id/test_fragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
于 2013-06-20T07:26:46.923 に答える
4
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/test_fragment"

それはあるべきではありfragmentませんLinearLayout

<fragment android:name="com.example.yourfragment"
            android:id="@+id/test_fragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
于 2012-05-31T12:32:11.043 に答える
4

実際にサブクラスを検索したandroid.support.v4.app.Fragment呼び出し中にレイアウトで使用していた. したがって、修正は代わりに呼び出すことでした。getFragmentManager()android.app.FragmentnullgetSupportFragmentManager()

一般に、サブクラス化してレイアウトで使用しているフラグメントのパッケージが、FragmentManager検索を実行する対応するものによって返されるものと同じであることを確認してください。

于 2015-10-12T23:13:42.960 に答える
2

R.id.test_fragmentあなたのLinearLayoutIDはフラグメントではありません。

このサンプルhttp://developer.android.com/guide/topics/fundamentals/fragments.html#Addingのように、xml からインフレートされたときにフラグメントを定義して ID を付けることができます。

于 2012-05-31T12:34:16.300 に答える
2

または、代わりに次を使用する必要がありました。

(MyFragment) getFragmentManager().findFragmentById(R.id.fragment_container);
于 2013-03-14T03:14:04.207 に答える