Ява.ленг.IllegalArgumentException: не найдено представлений для id 0x1020002 (android:id/content) для фрагмента
Я пытаюсь перейти от одного фрагмента к другому.. Он показывает следующую ошибку во время транзакции фрагмента -
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.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>
13 ответов
при использовании fragmentTransaction.replace(R.id.container,fragment)
он удалит все фрагменты, которые уже находятся в контейнере, и добавит новый в тот же контейнер.
теперь я могу предложить вам 2 вещи.Во-первых, если вы хотите использовать fragmentTransaction.replace(android.R.id.content, fragment);
что вы делаете прямо сейчас, а затем не устанавливайте контент для вашего Activity
используя setContentView
.Тогда это должно сработать.Знать, что именно!--6--> вы можете обратиться этот вопрос и ответ stackoverflow
или во-вторых, в плане вашего 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
as Fragment
контейнер вы можете гарантировать, что у вас всегда есть свободное место для размещения самого большого Fragment
'ы макет.
так что вы можете иметь свой FrameLayout
что-то вроде этого в вашем Activity
XML-файл макета
<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()
и это сработало для меня.
Можешь попробовать.
Если вы используете ViewPager, используйте getChildFragmentManager () для адаптера пейджера
viewPager.setAdapter(new ItemsAdapter(getChildFragmentManager()));
вы должны установить вид содержимого в вашей деятельности, что ваш PhotosFragment прилагается.
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_main);
//...
}
существует 2 наиболее распространенных причины этой проблемы
- указание неправильного макета в setContentView() метода onCreate ()
- ошибка также возникает при наличии вложенных фрагментов и добавлении их с помощью getSupportFragmentManager () вместо getChildFragmentManager ()
надеюсь, это поможет
Summved
Я знаю, что это очень поздно. Но это может сработать для других.
Я объявил идентификатор для каждого макета, например (3-я строка ниже)
<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) вложенные фрагменты становятся доступными. См.этой
для размещения фрагмента внутри другого фрагмента используйте getChildFragmentManager()
также доступно в библиотеке поддержки.
поместите этот блок кода в метод PhotosFragment2 onCreateView:
View rootView = inflater.inflate(R.layout.photos2, null);
вместо:
View rootView = inflater.inflate(R.layout.photos2, container, false);
в моем случае мне пришлось менять
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.sample,
container);
to
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.sample,
container, false);
этот ответ подчеркивает глупую ошибку, которая может произойти, которая возникает при вложении фрагментов или преобразовании действий в фрагменты.
если вы пытаетесь заменить фрагмент внутри фрагмента на fragmentManager
а вы не раздувая Родительский фрагмент это может вызвать проблему.
на BaseFragment.java OnCreateView
:
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);
проблема может быть в том, что вы добавляете фрагмент и beginTransaction в какой-то фрагмент, как
getFragmentManager().beginTransaction().replace(android.R.id.content, ImageBrowseFragment.newInstance(bundle),"ImageBrowseFragment")
.addToBackStack(null).commit();
Я просто меняю getFragmentManager()
to getActivity().getSupportFragmentManager()
тогда все идет хорошо
при добавлении фрагмента в фрагмент android.R.id.content
или Window.ID_ANDROID_CONTENT
, Я думаю, он представляет корневой контейнер вашего фрагмента, а не активность. Поэтому измените на getActivity().getSupportFragmentManager()
его
у меня была такая же ошибка, и после многих попыток я обнаружил, что проблема была с "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(); }
});