móviles - manual de programacion android pdf
Fragmento de Android no se ha encontrado ninguna vista para ID? (30)
Tengo un fragmento que estoy tratando de agregar a una vista.
FragmentManager fragMgr=getSupportFragmentManager();
feed_parser_activity content = (feed_parser_activity)fragMgr
.findFragmentById(R.id.feedContentContainer);
FragmentTransaction xaction=fragMgr.beginTransaction();
if (content == null || content.isRemoving()) {
content=new feed_parser_activity(item.getLink().toString());
xaction
.add(R.id.feedContentContainer, content)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.addToBackStack(null)
.commit();
Log.e("Abstract", "DONE");
}
Cuando se ejecuta este código, aparece el siguiente error en la depuración.
java.lang.IllegalArgumentException: No view found for id 0x7f080011
for fragment feed_parser_activity{41882f50 #2 id=0x7f080011}
feed_parser_activity
es un Fragmento que se establece en el diseño de Fragmento en xml.
Estoy usando FragmentActivity para alojar el diseño de fragmento que contiene feed_parser_layout
.
¿Estoy codificando esto correctamente arriba?
Con fragmentos anidados.
Al usar getChildFragmentManager()
lugar de getActivity.getSupportFragmentManager()
resolvió la falla java.lang.IllegalArgumentException: no se ha encontrado una vista para id para mí.
Dentro de tu fragmento usa esto:
int id = this.getId();
El contenedor para el fragmento significa framelayout o cualquier diseño en el que está reemplazando el fragmento no está allí, lo que causa el problema, espero ayuda
¡Feliz codificación!
En mi caso, esta excepción fue lanzada cuando usé diferentes ID para el mismo elemento de diseño (marcador de posición de fragmento) mientras tenía varios de ellos para diferentes Variantes de construcción. Por alguna razón, funciona perfectamente bien cuando reemplazas el fragmento por primera vez, pero si intentas hacerlo nuevamente obtendrás esta excepción. Así que asegúrese de usar la misma ID si tiene múltiples diseños para diferentes Variantes de Construcción.
En mi caso, estaba tratando de mostrar un DialogFragment que contenía un buscapersonas y esta excepción fue lanzada cuando FragmentPagerAdapter intentó agregar los Fragmentos al buscapersonas. Basándome en la respuesta de Howettl, supongo que se debió a que el padre Pager no era la vista establecida en setContentView () en mi FragmentActivity.
El único cambio que hice para resolver el problema fue crear el FragmentPagerAdapter pasando un FragmentMager obtenido al llamar a getChildFragmentManager (), no el que se obtuvo al llamar a getFragmentManager () como normalmente lo hago.
public class PagerDialog extends DialogFragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.pager_dialog, container, false);
MyPagerAdapter pagerAdapter = new MyPagerAdapter(getChildFragmentManager());
ViewPager pager = (ViewPager) rootView.findViewById(R.id.pager);
pagerAdapter.setAdapter(pagerAdapter);
return rootView;
}
}
En mi caso, estaba usando un archivo de clase de fragmento para declarar una clase de adaptador de vista de lista. Acabo de usar un archivo diferente para la clase de adaptador público y el error desapareció.
En mi caso, tuve un SupportMapFragment en un elemento de vista de reciclador (estaba usando el "liteMode" de menor costo, que hace que el mapa aparezca como no interactivo, casi como una imagen estática). Estaba usando el FragmentManager correcto, y todo parecía funcionar bien ... con una pequeña lista. Una vez que la lista de elementos excedió un poco la altura de la pantalla, comencé a tener este problema al desplazarme.
Resultó que era porque estaba inyectando un SupportMapFragment dinámico dentro de una vista, que estaba dentro de otro fragmento, para solucionar algunos problemas que tenía al intentar declararlo estáticamente en mi XML. Debido a esto, el diseño del marcador de posición del fragmento solo se podría reemplazar con el fragmento real una vez que la vista se adjuntó a la ventana, es decir, visible en la pantalla. Así que puse mi código para inicializar SupportMapFragment, hacer el reemplazo de Fragmento y llamar a getMapAsync () en el evento onAttachedToWindow.
Lo que olvidé fue asegurarse de que mi código no se ejecutara dos veces. Es decir, en el evento onAttachedToWindow, verifique si mi SupportMapFragment dinámico aún era nulo antes de intentar crear una nueva instancia de la misma y hacer un reemplazo de Fragmento. Cuando el elemento sale de la parte superior de RecyclerView, se separa de la ventana y luego se vuelve a unir cuando se regresa a él, por lo que este evento se dispara varias veces.
Una vez que agregué la verificación nula, sucedió solo una vez por cada elemento RecyclerView y el problema desapareció. TL; DR!
Encontré este problema cuando intenté reemplazar la vista con mi fragmento en onCreateView()
. Me gusta esto:
public class MyProjectListFrag extends Fragment {
private MyProjectListFragment myProjectListFragment;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
FragmentManager mFragmentManager = getFragmentManager();
myProjectListFragment = new MyProjectListFragment();
mFragmentManager
.beginTransaction()
.replace(R.id.container_for_my_pro_list,
myProjectListFragment, "myProjectListFragment")
.commit();
}
Me dijo
11-25 14:06:04.848: E/AndroidRuntime(26040): java.lang.IllegalArgumentException: No view found for id 0x7f05003f (com.example.myays:id/container_for_my_pro_list) for fragment MyProjectListFragment{41692f40 #2 id=0x7f05003f myProjectListFragment}
Luego solucioné este problema con la sustitución de onActivityCreated()
. Me gusta esto:
public class MyProjectListFrag extends Fragment {
private final static String TAG = "lch";
private MyProjectListFragment myProjectListFragment;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater
.inflate(R.layout.frag_my_project_list, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
FragmentManager mFragmentManager = getFragmentManager();
myProjectListFragment = new MyProjectListFragment();
mFragmentManager
.beginTransaction()
.replace(R.id.container_for_my_pro_list,
myProjectListFragment, "myProjectListFragment")
.commit();
}
-
onCreateView()
devolver una vista enonCreateView()
para poder reemplazarla más tarde - Puede poner cualquier operación hacia esta vista en la siguiente función en el ciclo de elevación de fragmentos, como
onActivityCreated()
¡Espero que esto ayude!
Esta excepción también puede ocurrir si el ID de diseño que está pasando a FragmentTransaction.replace(int ID, fragment)
existe en otros diseños que se están inflando. Asegúrese de que la ID de diseño sea única y que funcione.
Esta página parece ser una buena ubicación central para publicar sugerencias sobre la Fragment IllegalArgumentException. Aquí hay una cosa más que puedes probar. Esto es lo que finalmente me funcionó:
Había olvidado que tenía un archivo de diseño separado para la orientación horizontal. Después de agregar mi contenedor FrameLayout allí, también, el fragmento funcionó.
En una nota aparte, si ya probó todo lo demás sugerido en esta página (y también en toda Internet) y sacó su cabello durante horas, considere simplemente arrojar estos molestos fragmentos y volver a un buen diseño estándar antiguo. (Eso es realmente lo que estaba haciendo cuando finalmente descubrí mi problema). Aún puedes usar el concepto de contenedor. Sin embargo, en lugar de rellenarlo con un fragmento, puede usar la etiqueta de include
xml para rellenarla con el mismo diseño que habría usado en su fragmento. Podrías hacer algo como esto en tu diseño principal:
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<include layout="@layout/former_fragment_layout" />
</FrameLayout>
donde former_fragment_layout
es el nombre del archivo de diseño xml que intentabas usar en tu fragmento. Consulte Reutilización de diseños con incluir para obtener más información.
Este error también ocurre al tener fragmentos anidados y agregarlos con getSupportFragmentManager () en lugar de getChildFragmentManager ().
Esto sucede cuando estás llamando desde un fragmento dentro de otro.
utilizar :
getActivity().getSupportFragmentManager().beginTransaction();
He tenido el mismo problema cuando estaba haciendo transacciones de fragmentos mientras se creaba la actividad.
El problema principal es lo que Nick ya ha señalado : el árbol de vista todavía no se ha inflado. Pero su solución no funcionó, la misma excepción en onResume, onPostCreate, etc.
La solución es agregar una devolución de llamada al fragmento del contenedor para señalar cuando esté listo:
public class MyContainerFragment extends Fragment {
public static interface Callbacks {
void onMyContainerAttached();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.d(TAG, "--- onAttach");
((Callbacks) activity).onMyContainerAttached();
}
//... rest of code
}
Y luego en actividad:
public class MainActivity extends Activity
implements MyContainerFragment.Callbacks
{
@Override
public void onMyContainerAttached() {
getFragmentManager()
.beginTransaction()
.replace(R.id.containerFrame, new MyFragment())
.commit();
}
//...
}
La solución fue usar getChildFragmentManager()
en lugar de getFragmentManager()
al llamar desde un fragmento. Si está llamando al método desde una actividad, use getFragmentManager()
.
Eso solucionará el problema.
Me estaba enfrentando a un error desagradable cuando utilizaba Viewpager en la Vista del reciclador. Debajo del error me enfrenté en una situación especial. Comencé un fragmento que tenía un RecyclerView con Viewpager (usando FragmentStatePagerAdapter). Funcionó bien hasta que cambié a un fragmento diferente al hacer clic en una celda en RecyclerView, y luego navegué hacia atrás utilizando el botón Atrás del hardware del teléfono y la aplicación falló.
Y lo divertido de esto fue que tenía dos Viewpagers en el mismo RecyclerView y que ambos estaban a unos 5 celdas de distancia (otros no estaban visibles en la pantalla, estaba abajo). Así que inicialmente solo apliqué la Solución al primer Viewpager y dejé la otra como está (Viewpager usando Fragmentos).
La navegación hacia atrás funcionó bien, cuando se pudo ver la primera página. Ahora, cuando me desplacé hasta el segundo y luego cambié el fragmento y regresé, se estrelló (Lo mismo sucedió con el primero). Así que tuve que cambiar los dos Viewpagers.
De todos modos, lea a continuación para encontrar la solución de trabajo. Error de caída abajo:
java.lang.IllegalArgumentException: No view found for id 0x7f0c0098 (com.kk:id/pagerDetailAndTips) for fragment ProductDetailsAndTipsFragment{189bcbce #0 id=0x7f0c0098}
Pasó horas depurándolo. Lea esta publicación completa de Thread hasta la parte inferior aplicando todas las soluciones, incluso asegurándose de que esté pasando childFragmentManager.
Nada funcionó.
Finalmente, en lugar de usar FragmentStatePagerAdapter, extendí PagerAdapter y lo usé en Viewpager sin usar fragmentos. Creo que algunos donde hay un error con fragmentos anidados. De todos modos, tenemos opciones. Leer ...
El siguiente enlace fue muy útil:
El enlace puede morir, así que estoy publicando mi Solución implementada aquí abajo:
public class ScreenSlidePagerAdapter extends PagerAdapter {
private static final String TAG = "ScreenSlidePager";
ProductDetails productDetails;
ImageView imgProductImage;
ArrayList<Imagelist> imagelists;
Context mContext;
// Constructor
public ScreenSlidePagerAdapter(Context mContext,ProductDetails productDetails) {
//super(fm);
this.mContext = mContext;
this.productDetails = productDetails;
}
// Here is where you inflate your View and instantiate each View and set their values
@Override
public Object instantiateItem(ViewGroup container, int position) {
LayoutInflater inflater = LayoutInflater.from(mContext);
ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.product_image_slide_cell,container,false);
imgProductImage = (ImageView) layout.findViewById(R.id.imgSlidingProductImage);
String url = null;
if (imagelists != null) {
url = imagelists.get(position).getImage();
}
// This is UniversalImageLoader Image downloader method to download and set Image onto Imageview
ImageLoader.getInstance().displayImage(url, imgProductImage, Kk.options);
// Finally add view to Viewgroup. Same as where we return our fragment in FragmentStatePagerAdapter
container.addView(layout);
return layout;
}
// Write as it is. I don''t know much about it
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
/*super.destroyItem(container, position, object);*/
}
// Get the count
@Override
public int getCount() {
int size = 0;
if (productDetails != null) {
imagelists = productDetails.getImagelist();
if (imagelists != null) {
size = imagelists.size();
}
}
Log.d(TAG,"Adapter Size = "+size);
return size;
}
// Write as it is. I don''t know much about it
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
Espero que esto haya sido útil !!
Mi error fue en el FragamentTransaction
.
Estaba haciendo esto. t.replace(R.layout.mylayout);
en lugar de t.replace(R.id.mylayout);
La diferencia es que uno es el diseño y el otro es una referencia al layout(id)
Otro escenario que he conocido. Si usa fragmentos anidados, diga un ViewPager en un Fragmento con sus páginas también Fragmentos.
Cuando realice la transacción de Fragmento en el fragmento interno (página de ViewPager), necesitará
FragmentManager fragmentManager = getActivity().getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
getActivity () es la clave aquí. ...
Recibí este error cuando actualicé de com.android.support:support-v4:21.0.0
a com.android.support:support-v4:22.1.1
.
Tuve que cambiar mi diseño de esto:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container_frame_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
A esto:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/container_frame_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
</FrameLayout>
Así que el diseño DEBE tener una vista de niño. Supongo que hicieron cumplir esto en la nueva biblioteca.
Sé que esto ya se ha respondido para un caso, pero mi problema era ligeramente diferente y pensé que lo compartiría en caso de que alguien más estuviera en mi lugar.
Estaba realizando una transacción en onCreate()
, pero en este punto el árbol de vista no se ha inflado, por lo que aparece este mismo error. Poner el código de transacción en onResume()
hizo que todo funcionara bien.
¡Tan solo asegúrese de que su código de transacción se ejecute después de que se haya inflado el árbol de vistas!
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);
Siempre limpie su proyecto después de cambiar cualquier cosa en los archivos de diseño xml.
En eclipse: Proyecto> Limpiar
Solo en caso de que alguien haya cometido el mismo error estúpido que yo; verifique que no esté sobrescribiendo el contenido de la actividad en algún lugar (es decir, busque llamadas adicionales a setContentView)
En mi caso, debido a copiar y pegar por descuido, utilicé DataBindingUtil.setContentView en mi fragmento, en lugar de DataBindingUtil.inflate, que arruinó el estado de la actividad.
También tuve este problema, hasta que me di cuenta de que había especificado el diseño incorrecto en setContentView()
del método onCreate()
de FragmentActivity.
El ID pasado a FragmentTransaction.add()
, en su caso R.id.feedContentContainer
, debe ser un elemento secundario del diseño especificado en setContentView()
.
No nos mostró su método onCreate()
, así que quizás este sea el mismo problema.
Tuve el mismo error y después de probar muchas cosas, descubrí que el problema era la identificación del localizador. Estaba usando android:id="@+id/someName"
lugar de eso, deberías usar:
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Tuve el mismo problema pero mi problema estaba ocurriendo en el cambio de orientación. Ninguna de las otras soluciones funcionó. Así que resulta que olvidé quitar setRetainInstance(true);
de mis fragmentos, al hacer un diseño de dos o un panel basado en el tamaño de la pantalla.
Tuve el mismo problema, mi error fue que olvidé agregar el código xml de framlayout a otro diseño (para otro idioma) de la actividad. Mi aplicación fue hecha para múltiples idiomas, así que tenía dos diseños para cada actividad. De derecha a izquierda y de izquierda a derecha
Tuve este mismo problema, permítame publicar mi código para que todos puedan verlo y no hacer lo mismo que yo.
@Override
protected void onResume()
{
super.onResume();
fragManager = getSupportFragmentManager();
Fragment answerPad=getDefaultAnswerPad();
setAnswerPad(answerPad);
setContentView(R.layout.abstract_test_view);
}
protected void setAnswerPad(AbstractAnswerFragment pad)
{
fragManager.beginTransaction()
.add(R.id.AnswerArea, pad, "AnswerArea")
.commit();
fragManager.executePendingTransactions();
}
Tenga en cuenta que estaba configurando fragmentos antes de setContentView
. Ups
Tuve este problema (al crear mi IU en código) y fue causado por mi ViewPager
(que mostró que Fragment
s) no tenía un conjunto de ID, así que simplemente usé pager.setID(id)
y luego funcionó.
Esta página me ayudó a darme cuenta de eso.
Una respuesta que leí en otro hilo similar a este que me funcionó cuando tuve este problema involucró el diseño xml.
Su logcat dice "No se ha encontrado ninguna vista para el ID 0x7f080011".
Abra gen->package->R.java->id
y luego busque id 0x7f080011
.
Cuando tuve este problema, este ID pertenecía a un FrameLayout
en mi archivo activity_main.xml
.
El FrameLayout no tenía una ID (no había ninguna declaración de android:id = "blablabla"
).
Asegúrese de que todos sus componentes en todos sus diseños tengan ID, particularmente el componente citado en el logcat.
commitNow()
este error, uso el commitNow()
reemplazar commit()
.
mFragment.getChildFragmentManager()
.beginTransaction()
.replace(R.id.main_fragment_container,fragment)
.commitNowAllowingStateLoss();
El commitNow
es un método de sincronización, el método commit()
es un método asíncrono.