私のクラスは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;
}
}
getChildFragmentManager()
の定義は次のとおりです。
このFragment内にFragmentsを配置および管理するためのプライベートFragmentManagerを返します。
一方、getFragmentManager()
(またはこの場合getSupportFragmentManager()
)の定義は次のとおりです。
このフラグメントのアクティビティに関連付けられたフラグメントと対話するためのFragmentManagerを返します。
基本的に、FragmentにはFragmentsを処理できる独自の内部FragmentManager
があります。子FragmentManagerは、追加されたFragmentのみに含まれるFragmentを処理するものです。他のFragmentManagerは、Activity
全体に含まれています。
この場合、私が推測しているのは、アクティビティのFragmentManagerにフラグメントを追加したということです。探しているものが含まれていない子FragmentManagerを取得します。したがって、別のFragmentManagerにあるため、指定されたIDのFragmentを見つけることができないため、例外が発生します。
getFragmentManager
はActivity
に属しますgetChildFragmentManager
はFragment
に属します
たとえば、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
_)
この答えは私の理解に基づいているため、間違っている場合は修正してください。お役に立てば幸いです
フラグメントのコンテナとして動作するフラグメントが必要な場合は、フラグメントのgetChildFragmentManagerメソッドを使用する必要があります。 getSupportFragmentManagerを使用する場合、基本的にはフラグメントマネージャーを使用します。これは、フラグメントの動作ではなく、アクティビティライフサイクルの動作を実行します。
たとえば、ViewPagerを含むフラグメントがありました。これはCollectionsFragmentと呼ばれます。そのため、タブとしてAllCollectionsFragment、MyCollectionsFragment、FavouriteCollectionsFragmentの3つのフラグメントが表示されました。そして、getActivity()。getSupportFragmentManager()を、使用しているFragmentStatePagerAdapterに渡しました。
そのため、次の動作が発生していました– 3つのタブフラグメントのonDestroyView/onDestroy/onDetach/onStopメソッドは呼び出されません。 getChildFragmentManagerを使用するように変更したとき、すべては問題ありませんでした。
必要に応じて、2つの方法のドキュメントを確認できます。
getChildFragmentManager():このFragment内にFragmentsを配置および管理するためのプライベートFragmentManagerを返します。
getSupportFragmentManager():このフラグメントのアクティビティに関連付けられたフラグメントと対話するためのFragmentManagerを返します。