transaction - fragment android definicion
java.lang.IllegalArgumentException: No se ha encontrado una vista para el id. 0x1020002(android: id/content) para el fragmento (13)
Cuando utilice fragmentTransaction.replace(R.id.container,fragment)
, eliminará cualquier fragmento que ya esté en el contenedor y agregará uno nuevo al mismo contenedor.
Ahora puedo sugerirte 2 cosas. Primero, si quieres usar fragmentTransaction.replace(android.R.id.content, fragment);
que está haciendo en este momento, entonces no configure el contenido para su Activity
usando setContentView
. Esto debería funcionar bien entonces. Para saber qué es exactamente android.R.id.content
puede referirse a esta pregunta y respuesta de stackoverflow
O, en segundo lugar, en el diseño de su Activity
tenga un FrameLayout
cuya identificación sea content
. Y luego usar
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();
Espero que esto ayude.
Más información:
Por sus comentarios, parece que tiene algún problema para tener la idea de utilizar FrameLayout
en el FrameLayout
de su Activity
(no en ninguno de los Fragment
del Fragment
). De los Documents
FrameLayout está diseñado para bloquear un área en la pantalla para mostrar un solo elemento. Generalmente, FrameLayout se debe usar para mantener una sola vista secundaria, ya que puede ser difícil organizar las vistas secundarias de una manera que se pueda escalar a diferentes tamaños de pantalla sin que los niños se superpongan entre sí.
Por lo tanto, el propósito principal de FrameLayout
es bloquear el área requerida para que se ajuste a la vista infantil más grande. Si usa un FrameLayout
como contenedor de Fragment
, puede asegurarse de tener siempre el espacio disponible para acomodar el diseño del Fragment
más grande.
Así que puedes tener tu FrameLayout
algo como esto en el archivo xml de diseño de tu 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>
Estoy tratando de pasar de un fragmento a otro. Muestra el siguiente error durante la transacción del fragmento.
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)
A continuación se muestran las clases. He utilizado el siguiente código para la transacción de fragmentos
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;
}
}
Archivo xml de actividad
<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>
Debe establecer una vista de contenido en su Actividad a la que se adjunte su PhotosFragment.
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_main);
//...
}
Desde Android 4.2 (API 17), los fragmentos anidados están disponibles. Ver this
Para colocar el fragmento dentro de otro fragmento use getChildFragmentManager()
También disponible en la biblioteca de soporte.
El problema puede ser que agregue un fragmento y beginTransaction en algún fragmento como
getFragmentManager().beginTransaction().replace(android.R.id.content, ImageBrowseFragment.newInstance(bundle),"ImageBrowseFragment")
.addToBackStack(null).commit();
Acabo de cambiar getFragmentManager()
por getActivity().getSupportFragmentManager()
Entonces todo va bien
Cuando agrega un fragmento en un fragmento, use android.R.id.content
o Window.ID_ANDROID_CONTENT
, supongo que representa el contenedor raíz de su fragmento, no la actividad. Así que cambie a getActivity().getSupportFragmentManager()
lo resuelve
En mi caso tuve que cambiar.
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.sample,
container);
a
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.sample,
container, false);
Esta respuesta resalta un error tonto que puede ocurrir, que surge cuando se anidan fragmentos o está convirtiendo las actividades en fragmentos.
Si está intentando reemplazar un fragmento dentro de un fragmento con fragmentManager
pero no está inflando el fragmento principal que puede causar un problema.
En BaseFragment.java OnCreateView
:
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.replace(R.id.container, new DifferentFragment())
.commit();
}
return super.onCreateView(inflater, container, savedInstanceState);
Reemplace super.onCreateView(inflater, container, savedInstanceState);
Con inflar el diseño correcto para el fragmento:
return inflater.inflate(R.layout.base_fragment, container, false);
Hay 2 razones más comunes para este problema
- Especificar el diseño incorrecto en setContentView () del método onCreate ()
- También se produce un error al tener fragmentos anidados y agregarlos con getSupportFragmentManager () en lugar de getChildFragmentManager ()
Espero que esto ayude
Sumado
No uso getSupportFragmentManager()
. Yo uso getChildFragmentManager()
y funcionó para mí. Puedes probarlo.
Ponga este bloque de código en el método onCreateView de PhotosFragment2:
View rootView = inflater.inflate(R.layout.photos2, null);
en lugar de:
View rootView = inflater.inflate(R.layout.photos2, container, false);
Sé que esto es muy tarde. Pero puede funcionar para otros.
Declaré el id para cada diseño, como (3ra línea abajo)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
Si está tratando de poner Fragment
en Fragment
, use getChildFragmentManager()
Si está utilizando ViewPager, use getChildFragmentManager () para el adaptador de buscapersonas
viewPager.setAdapter(new ItemsAdapter(getChildFragmentManager()));
Tuve el mismo error y, después de probar muchas cosas, encontré que el problema estaba en "id" y "getActivity (). GetSupportFragmentManager ()".
Antes de implementar me gustan estos
txt_more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getChildFragmentManager()
.beginTransaction()
.replace(R.id.content_frame, new OpportunitiesFragment())
.commit(); }
});
Entonces me cambié a estos
txt_more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
## Heading ##
getActivity().getSupportFragmentManager()
.beginTransaction()
.replace(android.R.id.content, new OpportunitiesFragment())
.commit(); }
});