web-dev-qa-db-ja.com

getSupportFragmentManager()とgetChildFragmentManager()の違いは何ですか?

私のクラスはFragmentを継承しているため、getSupportFragmentManager()を使用できません。 getChildFragmentManagerを使用していますが、エラー-IllegalArguementException:idのビューが見つかりません...エラーが表示されます。

任意のガイダンスをいただければ幸いです。

AttachmentsListFragmentを呼び出すコードは

Bundle b = new Bundle();
b.putSerializable("AttachmentsList", msg.attachments);  
        AttachmentListFragment listfrag = new AttachmentListFragment(msg.attachments);
FragmentTransaction transaction = getFragmentManager().beginTransaction();       
transaction.add(R.id.attachmentslistcontainer, listfrag);
transaction.addToBackStack(null);
transaction.commit();

attachmentslayout.xmlは

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:id="@+id/attachmentslistcontainer"
    Android:orientation="vertical" >

    <TextView
        Android:id="@+id/textViewAttachmentHeader"
        style="@style/Normal.Header.Toolbar"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:background="@color/list_separator_background"
        Android:ellipsize="end"
        Android:gravity="center"
        Android:maxLines="2"
        Android:text="@string/attachments_header"
        Android:textColor="#FFFFFFFF"
        Android:textSize="22sp"
        Android:textStyle="bold"
        Android:visibility="visible" />

    <ListView
        Android:id="@Android:id/list"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent" >
    </ListView>

</FrameLayout>

AttachmentsListFragment.Java

public class AttachmentListFragment extends ListFragment implements IAttachmentsData {

    ArrayList<Attachments> items = null;
    Integer cellLayoutID;
    Integer index;

    public AttachmentListFragment() {

    }

    public AttachmentListFragment(ArrayList<Attachments> items) {
        this.items = items;
        Log.i("Logging", "Items size" + items.size()); //$NON-NLS-1$
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle bundle;
        if (savedInstanceState != null) {
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        //super.onCreateView(inflater, container, savedInstanceState);

        //  setContentView(R.layout.attachmentslayout);
        View view = inflater.inflate(R.layout.attachmentslayout, container, false);
        return view;
    }


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setListAdapter(new AttachmentAdapter(
                getActivity().getApplicationContext(),
                R.layout.attachmentslistcellcontent,
                items));
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub
        super.onListItemClick(l, v, position, id);
        index = position;
        Intent intent = new Intent();
        Bundle b = new Bundle();
        b.putByteArray("Data", items.get(position).getImageData());
        intent.putExtras(b);
    }


    public byte[] getData() {
        // TODO Auto-generated method stub
        if (items != null && index < items.size()) {

            return items.get(index).getImageData();
        }
            return null;
    }

}
61
NinjaCoder

getChildFragmentManager()の定義は次のとおりです。

このFragment内にFragmentsを配置および管理するためのプライベートFragmentManagerを返します。

一方、getFragmentManager()(またはこの場合getSupportFragmentManager())の定義は次のとおりです。

このフラグメントのアクティビティに関連付けられたフラグメントと対話するためのFragmentManagerを返します。

基本的に、FragmentにはFragmentsを処理できる独自の内部FragmentManagerがあります。子FragmentManagerは、追加されたFragmentのみに含まれるFragmentを処理するものです。他のFragmentManagerは、Activity全体に含まれています。

この場合、私が推測しているのは、アクティビティのFragmentManagerにフラグメントを追加したということです。探しているものが含まれていない子FragmentManagerを取得します。したがって、別のFragmentManagerにあるため、指定されたIDのFragmentを見つけることができないため、例外が発生します。

129
DeeV

getFragmentManagerActivityに属します
getChildFragmentManagerFragmentに属します

たとえば、MainActivity、_Fragment1_、_Fragment2_、_container_view_on_main_が_activty_main.xml_のレイアウトであるアプリがあるとします

表示する _Fragment1_ on MainActivity we must use getSupportFragmentManager()

_getSupportFragmentManager().beginTransaction().replace(R.id.container_view_on_main, Fragment1.newInstance());
_

表示する _Fragment2_ from _Fragment1_ 2つの方法があります

USE getFragmentManager()

_getFragmentManager().beginTransaction().replace(R.id.container_view_on_main, Fragment1.newInstance());
_

USE getChildFragmentManager()

まず、_container_view_on_fragment1_内にID _fragment1.xml_のレイアウトを作成する必要があります。

_getChildFragmentManager().beginTransaction().replace(R.id.container_view_on_fragment1, Fragment2.newInstance()).commit();
_

[〜#〜]結論[〜#〜]

このデモでは、_Fragment1_から_Fragment2_に移動するときにgetFragmentManager()を使用する必要があると思います。シンプルでパフォーマンスに優れているためです(_Fragment1_は_Fragment2_ 開いた)

getChildFragmentManager()を使用する場合
たとえば、MainActivityには3ページのViewPagerがあり、各ページ内でフラグメントを置き換える必要があります。

[〜#〜] more [〜#〜]
-getParentFragment()
getFragmentManager() => nullを返す
getChildFragmentManager() =>常にルートフラグメントを返します(Fragment3に行っても、デモでは_Fragment1_)

この答えは私の理解に基づいているため、間違っている場合は修正してください。お役に立てば幸いです

13
Phan Van Linh

フラグメントのコンテナとして動作するフラグメントが必要な場合は、フラグメントのgetChildFragmentManagerメソッドを使用する必要があります。 getSupportFragmentManagerを使用する場合、基本的にはフラグメントマネージャーを使用します。これは、フラグメントの動作ではなく、アクティビティライフサイクルの動作を実行します。

たとえば、ViewPagerを含むフラグメントがありました。これはCollectionsFragmentと呼ばれます。そのため、タブとしてAllCollectionsFragment、MyCollectionsFragment、FavouriteCollectionsFragmentの3つのフラグメントが表示されました。そして、getActivity()。getSupportFragmentManager()を、使用しているFragmentStatePagerAdapterに渡しました。

そのため、次の動作が発生していました– 3つのタブフラグメントのonDestroyView/onDestroy/onDetach/onStopメソッドは呼び出されません。 getChildFragmentManagerを使用するように変更したとき、すべては問題ありませんでした。

必要に応じて、2つの方法のドキュメントを確認できます。

getChildFragmentManager():このFragment内にFragmentsを配置および管理するためのプライベートFragmentManagerを返します。

getSupportFragmentManager():このフラグメントのアクティビティに関連付けられたフラグメントと対話するためのFragmentManagerを返します。

0