あるフラグメントから別のフラグメントに移動しようとしています。フラグメントトランザクション中に次のエラーが表示されます。
Java.lang.IllegalArgumentException: No view found for id 0x1020002 (Android:id/content) for fragment PhotosFragment2{41a57218 #3 id=0x1020002}
at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:930)
at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1115)
at Android.support.v4.app.BackStackRecord.run(BackStackRecord.Java:682)
at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1478)
at Android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.Java:446)
at Android.os.Handler.handleCallback(Handler.Java:615)
at Android.os.Handler.dispatchMessage(Handler.Java:92)
at Android.os.Looper.loop(Looper.Java:153)
at Android.app.ActivityThread.main(ActivityThread.Java:5086)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:511)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:821)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:584)
at dalvik.system.NativeStart.main(Native Method)
以下はクラスです。フラグメントトランザクションに次のコードを使用しました。
Fragment fragment = new PhotosFragment2();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(Android.R.id.content, fragment);
fragmentTransaction.commit();
PhotosFragment.Java
public class PhotosFragment extends Fragment {
private FragmentActivity myContext;
@Override
public void onAttach(Activity activity) {
myContext = (FragmentActivity) activity;
super.onAttach(activity);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.photos, container, false);
rootView.setVerticalScrollBarEnabled(false);
int[] mThumbIds = {
R.drawable.album8, R.drawable.album3,
R.drawable.album4, R.drawable.album8,
R.drawable.album6, R.drawable.album7,
R.drawable.album12, R.drawable.album10,
};
int[] mThumbIds2 = {
R.drawable.album8, R.drawable.album3,
R.drawable.album4,
R.drawable.album6, R.drawable.album7,
R.drawable.album9, R.drawable.album10,
R.drawable.album11, R.drawable.album12, R.drawable.album8,
R.drawable.album8, R.drawable.album3,
R.drawable.album4,
R.drawable.album6, R.drawable.album7,
R.drawable.album9, R.drawable.album10,
R.drawable.album11, R.drawable.album12, R.drawable.album8,
};
CustomGridSingle2 adapter = new CustomGridSingle2(myContext, mThumbIds);
GridView grid = (GridView)rootView.findViewById(R.id.gridView);
final ImageView img= (ImageView)rootView.findViewById(R.id.imageView7);
grid.setFocusable(false);
grid.setAdapter(adapter);
grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Fragment fragment = new PhotosFragment2();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(Android.R.id.content, fragment);
fragmentTransaction.commit();
}
});
CustomGridSingle2 adapter2 = new CustomGridSingle2(myContext, mThumbIds2);
GridView grid2 = (GridView)rootView.findViewById(R.id.gridView2);
grid2.setFocusable(false);
grid2.setAdapter(adapter2);
grid2.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Fragment fragment = new PhotosFragment2();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(Android.R.id.content, fragment);
fragmentTransaction.commit();
}
});
return rootView;
}
}
PhotosFragment2.Java
public class PhotosFragment2 extends Fragment {
private FragmentActivity myContext;
@Override
public void onAttach(Activity activity) {
myContext = (FragmentActivity) activity;
super.onAttach(activity);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View rootView = inflater.inflate(R.layout.photos2, container, false);
myContext.getActionBar().hide();
return rootView;
}
}
アクティビティxmlファイル
<Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<FrameLayout
Android:id="@+id/frame_container"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
<LinearLayout
Android:id="@+id/left_drawer_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:background="@drawable/bgmenu"
Android:orientation="vertical">
<RelativeLayout
Android:id="@+id/profilelayout"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_weight="0"
Android:paddingTop="10dp">
<ImageView
Android:id="@+id/drawer_profile_image"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignBottom="@+id/drawer_profile_background"
Android:layout_alignLeft="@+id/drawer_profile_background"
Android:layout_alignRight="@+id/drawer_profile_background"
Android:layout_alignTop="@+id/drawer_profile_background"
Android:layout_marginBottom="7.667dp"
Android:layout_marginLeft="6.5dp"
Android:layout_marginRight="8.3dp"
Android:layout_marginTop="7.667dp"
Android:scaleType="centerCrop"></ImageView>
<ImageView
Android:id="@+id/drawer_profile_background"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerHorizontal="true"
Android:scaleType="centerCrop"
Android:src="@drawable/profileblock">
</ImageView>
<ImageView
Android:id="@+id/settingicon"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignBottom="@+id/drawer_profile_background"
Android:layout_marginLeft="-15dp"
Android:layout_toRightOf="@+id/drawer_profile_background"
Android:background="@drawable/settings" />
<textview
Android:id="@+id/username"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/drawer_profile_background"
Android:layout_centerHorizontal="true"
Android:layout_marginTop="5dp"
Android:text="Name"
Android:textAppearance="?android:attr/textAppearanceListItemSmall"
Android:textColor="@Android:color/white" />
</RelativeLayout>
<ListView
Android:id="@+id/list_slidermenu"
style="@style/buttonStyle"
Android:layout_width="match_parent"
Android:layout_height="0dp"
Android:layout_marginTop="30dp"
Android:layout_weight="2"
Android:cacheColorHint="@Android:color/transparent"
Android:choiceMode="singleChoice"
Android:divider="@Android:color/transparent"
Android:dividerHeight="1dp"
Android:listSelector="@Android:color/transparent"
Android:scrollbars="none" />
</LinearLayout>
</Android.support.v4.widget.DrawerLayout>
fragmentTransaction.replace(R.id.container,fragment)
を使用すると、既にコンテナ内にあるフラグメントがすべて削除され、新しいコンテナが同じコンテナに追加されます。
今、私はあなたに2つのことを提案することができます。最初に、あなたが今しているfragmentTransaction.replace(Android.R.id.content, fragment);
を使用したい場合、Activity
を使用してsetContentView
のコンテンツを設定しないでくださいこれで問題なく動作するはずです。正確にAndroid.R.id.content
を知るには、参照することができます このstackoverflowの質問と回答
または、2番目に、Activity
のレイアウトに、FrameLayout
というIDを持つcontent
があります。そして使用する
fragmentTransaction.replace(R.id.content, fragment);
fragmentTransaction.addToBackStack(null);//add the transaction to the back stack so the user can navigate back
// Commit the transaction
fragmentTransaction.commit();
お役に立てれば。
詳細:
あなたのコメントから、FrameLayout
のレイアウト(Activity
のレイアウトではない)でFragment
を使用するというアイデアを得るのに問題があるようです。 ドキュメント
FrameLayoutは、画面上の領域をブロックして単一のアイテムを表示するように設計されています。通常、FrameLayoutは単一の子ビューを保持するために使用する必要があります。子が互いに重なり合わないように、さまざまな画面サイズにスケーラブルな方法で子ビューを整理することは難しいためです。
したがって、FrameLayout
の主な目的は、最大の子ビューに適合するために必要な領域をブロックすることです。 FrameLayout
をFragment
コンテナとして使用する場合は、最大のFragment
のレイアウトを収容するためのスペースを常に確保することができます。
FrameLayout
のレイアウトxmlファイルにActivity
のようなものを含めることができます
<FrameLayout
Android:id="@+id/content"
Android:layout_height="match_parent"
Android:layout_width="match_parent">
<!--you can put your existing views of your current xml here, so yes your entire xml is now inside this FrameLayout -->
</FrameLayout>
getSupportFragmentManager()
は使用しません。私はgetChildFragmentManager()
を使用し、それは私のために働いた。あなたはそれを試すことができます。
Fragment
をFragment
に入れようとする場合は、getChildFragmentManager()
を使用します
ViewPagerを使用している場合、ページャーアダプターにgetChildFragmentManager()を使用します。
viewPager.setAdapter(new ItemsAdapter(getChildFragmentManager()));
PhotosFragmentが添付されるアクティビティのコンテンツビューを設定する必要があります。
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_main);
//...
}
この問題には2つの最も一般的な理由があります
これが役立つことを願って
要約
私はこれが非常に遅いことを知っています。しかし、それは他の人のために働くかもしれません。
(3行目)のように、各レイアウトのIDを宣言しました
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/container"
Android 4.2(API 17)ネストされたフラグメントが使用可能になるため。 this を参照してください
フラグメントを他のフラグメント内に配置するには、getChildFragmentManager()
を使用します
サポートライブラリでも利用可能。
問題は、フラグメントを追加し、次のようなフラグメントにbeginTransactionを追加することです。
_getFragmentManager().beginTransaction().replace(Android.R.id.content, ImageBrowseFragment.newInstance(bundle),"ImageBrowseFragment")
.addToBackStack(null).commit();
_
getFragmentManager()
をgetActivity().getSupportFragmentManager()
に変更するだけです
その後、すべてがうまくいきます
フラグメントにフラグメントを追加するときは、_Android.R.id.content
_または_Window.ID_Android_CONTENT
_を使用します。アクティビティではなく、フラグメントのルートコンテナを表していると思います。 getActivity().getSupportFragmentManager()
に変更するとうまくいきます
この回答は、フラグメントをネストするとき、またはアクティビティをフラグメントに変換するときに発生する愚かな間違いを強調しています。
フラグメント内のフラグメントをfragmentManager
で置き換えようとしているが、親フラグメントを膨張させていないである場合、問題が発生する可能性があります。
BaseFragment.JavaOnCreateView
:
_if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.replace(R.id.container, new DifferentFragment())
.commit();
}
return super.onCreateView(inflater, container, savedInstanceState);
_
super.onCreateView(inflater, container, savedInstanceState);
をフラグメントの正しいレイアウトを膨らませて置き換えます:
_ return inflater.inflate(R.layout.base_fragment, container, false);
_
次のコードブロックをPhotosFragment2のonCreateViewメソッドに追加します。
View rootView = inflater.inflate(R.layout.photos2, null);
の代わりに:
View rootView = inflater.inflate(R.layout.photos2, container, false);
同じエラーが発生し、多くのことを試した後、問題は「id」と「getActivity()。getSupportFragmentManager()」にあることがわかりました。
これらを実装する前に
txt_more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getChildFragmentManager()
.beginTransaction()
.replace(R.id.content_frame, new OpportunitiesFragment())
.commit(); }
});
次に、これらに変更しました
txt_more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
## Heading ##
getActivity().getSupportFragmentManager()
.beginTransaction()
.replace(Android.R.id.content, new OpportunitiesFragment())
.commit(); }
});
私の場合、私は変えなければなりませんでした
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.sample,
container);
に
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.sample,
container, false);
フラグメント(ページ)でViewPager
を使用し、新しいフラグメントページからを表示しようとすると、このエラーが発生します。 Activity
のページからViewPager
のコンテナを参照することはできないと思います。
この場合、getActivity()
を呼び出す必要があります。次に、Activity
に、新しいフラグメントを開くメソッドを記述します。
_class YourActivity : AppCompatActivity() {
fun showNewFragment(title: String) {
val fm = supportFragmentManager
fm?.beginTransaction()?.apply {
val fragment = NewFragment.newInstance(title)
replace(R.id.container, fragment, NewFragment.TAG)
addToBackStack(null)
}?.commit()
}
}
class PageFragment : Fragment() {
private fun show() {
(activity as YourActivity).showNewFragment("New fragment")
}
}
_
getParentFragment()
を呼び出して新しいフラグメントを追加する場合、ViewPager
内に新しいフラグメントを配置します。
_class ViewPagerFragment : Fragment() {
fun showNewFragment(title: String) {
val fm = childFragmentManager
fm?.beginTransaction()?.apply {
val fragment = NewFragment.newInstance(title)
replace(R.id.container, fragment, NewFragment.TAG)
addToBackStack(null)
}?.commit()
}
}
class PageFragment : Fragment() {
private fun show() {
(parentFragment as? ViewPagerFragment)?.showNewFragment("New fragment")
}
}
_