Android: conflicto de ID cuando se crean 3 pestañas o más
Tengo una vista de pestañas en Android, y las pestañas comparten el mismo diseño xml, que se generan dinámicamente en base a JSON. Por ejemplo, si tengo un menú, creará una pestaña. Dos menús, dos pestañas. Y así. Como todas las pestañas se basan en el mismo objeto "Menú", comparten el mismo xml que se infla.
La construcción de las lengüetas va sin problemas. Cuando tienen una o dos pestañas, el cambio de estados y el deslizamiento se hace perfectamente. Al tener tres o más pestañas, pasar a la derecha está funcionando, pero cuando vuelvo a deslizar hacia la izquierda, obtengo este error:
- API de gráficos para Android
- No se puede crear servicio com.parse.PushService: java.lang.NullPointerException
- ¿Hay una manera más fácil de analizar XML en Java?
- Android: El elemento de nivel superior no se completa en AndroidManifest.xml
- Doclava - ¿Cómo generar versionado xml?
java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class android.widget.AbsListView$SavedState instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/header_list_view. Make sure other views do not use the same id.
Aquí está mi código onCreateView:
public class MenuToListFragment extends Fragment { HeaderListView headerListView; // (most of the logic removed) @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_menu, container, false); headerListView = (HeaderListView) rootView.findViewById(R.id.header_list_view); return rootView; } }
Y aquí está mi diseño xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="<removed>.DisplayMenus"> <com.applidium.headerlistview.HeaderListView android:id="@+id/header_list_view" android:layout_height="wrap_content" android:layout_width="wrap_content" /> </LinearLayout>
¡Gracias por tu ayuda!
- Selector con android: drawable = atributo "@ color / transparent"
- ¿Puedo dibujar rectángulo en XML?
- Cómo cambiar la casilla de verificación (marcar casilla) color a blanco en android XML
- Cambiar (Pulgar y Seguir) Android
- Este campo de texto no especifica un inputType o una pista
- Razón por la cual el atributo style no utiliza el prefijo android: namespace
- Cómo eliminar el borde en el diseño
- Android: Añadir divisor entre los elementos de RecyclerView
Muy bien, encontró el error! Usando el método OnActivityCreated, al llamar a HeaderListView, tuve que asignar una Id única usando headerListView.setId (); Para el valor de este id, tuve que pasar la posición de la ficha por un paquete, usando setArguments y getArguments. Una manera que no he explorado aún es generar un ID usando headerListView.setId (headerListView.generateViewId ()).
Ahora, sobre el "por qué" sucedió sólo cuando tener 3 vista o más. Aquí es donde estoy adivinando y me encantaría algunos comentarios. Al inflar una pestaña, encontré que sólo los vecinos se mantuvieron en la memoria (el otro son de alguna manera caído?). Si dos pestañas, pasando a la izquierda oa la derecha, el programa no generará ni restaurará las vistas, ya que el conjunto (ficha de uso del vecino) siempre será el mismo. Ahora, si tengo 3 pestañas y deslizar todo el camino a la derecha, la primera pestaña se pone a dormir. Volviendo a la segunda pestaña obliga a Android a restaurar la primera pestaña de su estado de reposo. Debido a que la pestaña sleeped tenía el mismo id que todos los demás, generaría un conflicto. Voila!
Espero que esto ayude a las personas a encontrar el mismo problema
Cambié la definición del diseño en:
<com.applidium.headerlistview.HeaderListView android:layout_width="fill_parent" android:layout_height="fill_parent" android:tag="HeaderListView" />
Y luego encontrar la vista con la etiqueta:
mHeaderListView = (HeaderListView) view.findViewWithTag("HeaderListView");
Parece que funciona, no más java.lang.IllegalArgumentException
.
- Cómo dibujar la imagen en el androide de vista superficial
- Implementación de sonidos de pitido en la aplicación de Android