Incluyendo list_content en el diseño de lista para conservar la funcionalidad ListFragment

Primero de, estoy usando La Biblioteca de Compatibilidad de Android V4 rev.3 para mi 1.6 (Donut)

Cuando crea un ListFragment por primera vez, muestra un indicador de progreso indeterminado hasta que use setListAdabpter (). De acuerdo con la documentación de ListFragment.onCreateView, si quiero usar una disposición personalizada:

Si está sobreescribiendo este método con su propio contenido personalizado, considere incluir el diseño estándar {@link android.R.layout # list_content} en su archivo de diseño, para que continúe reteniendo todo el comportamiento estándar de ListFragment. En particular, esta es actualmente la única manera de mostrar el estado de progreso indeterminado incorporado.

El problema es que cuando <include layout="@android:layout/list_content" ...> en mi archivo de diseño e intento: <include layout="@android:layout/list_content" ...> it (eclipse) me dice que

El recurso no es público. (En 'layout' con el valor '@android: layout / list_content').

Tomo eso para significar que list_content.xml no existe en mi código fuente V4. Que es correcto porque según los documentos apareció en API v11.

Acabo de asumir que existiría en la fuente de la biblioteca de compatibilidad, no sé si lo hace …

La única otra solución que puedo ver sería cavar el código fuente del API V11 de android y copiar y pegar list_content.xml . Por ahora sin embargo me gustaría evitar este hackery. ¿Es esta la única solución?

El ListFragment incluido en la biblioteca de compatibilidad no parece utilizar ese diseño (list_content) como el real. Esto puede deberse a que se ofrece como un tarro y no es posible empaquetar recursos. Aquí están los contenidos de su onCreateView :

ListFragment de la biblioteca de compatibilidad:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final Context context = getActivity(); FrameLayout root = new FrameLayout(context); // ------------------------------------------------------------------ LinearLayout pframe = new LinearLayout(context); pframe.setId(INTERNAL_PROGRESS_CONTAINER_ID); pframe.setOrientation(LinearLayout.VERTICAL); pframe.setVisibility(View.GONE); pframe.setGravity(Gravity.CENTER); ProgressBar progress = new ProgressBar(context, null, android.R.attr.progressBarStyleLarge); pframe.addView(progress, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); root.addView(pframe, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); // ------------------------------------------------------------------ FrameLayout lframe = new FrameLayout(context); lframe.setId(INTERNAL_LIST_CONTAINER_ID); TextView tv = new TextView(getActivity()); tv.setId(INTERNAL_EMPTY_ID); tv.setGravity(Gravity.CENTER); lframe.addView(tv, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); ListView lv = new ListView(getActivity()); lv.setId(android.R.id.list); lv.setDrawSelectorOnTop(false); lframe.addView(lv, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); root.addView(lframe, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); // ------------------------------------------------------------------ root.setLayoutParams(new FrameLayout.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); return root; } 

ListFragment desde Android 4.0:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(com.android.internal.R.layout.list_content, container, false); } 

Dada la opción entre copiar el archivo de diseño de la fuente APIv11 e incluir este código de inicialización de la vista, creo que está claro cuál sería considerado 'hackery';)

Me sentí frustrado al ver que el diseño de list_content no estaba disponible con la biblioteca de soporte. Mi enfoque era simplemente reutilizar el método onCreateView predeterminado del ListFragment y añadirlo como parte de mi diseño personalizado:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View listContent = super.onCreateView(inflater, container, savedInstanceState); View v = inflater.inflate(R.layout.my_custom_layout, container, false); FrameLayout listContainer = (FrameLayout) v.findViewById(R.id.my_list_container); listContainer.addView(listContent); return v; } 

Añadí un FrameLayout donde el ListView solía estar en mi diseño personalizado.

Un trabajo posible alrededor de incorporar default @ android.R.layout / list_content en el diseño personalizado cuando se utiliza la biblioteca de compatibilidad es crear un dummy ListFragment:

 package com.example.app; import android.support.v4.app.ListFragment; public class ListContentFragment extends ListFragment { @Override public void onViewCreated(View view, Bundle savedInstanceState) { //Supress default list and empty text behavior //super.onViewCreated(view, savedInstanceState); } } 

A continuación, incluya este fragmento (en lugar de la distribución recomendada list_content) en su diseño personalizado:

 ... <fragment class="com.example.app.ListContentFragment" android:layout_weight ="1" android:layout_width ="fill_parent" android:layout_height ="0dip" /> ... 

De esta manera obtendrá un comportamiento predeterminado completamente funcional del ListFragment mientras todavía tiene un diseño personalizado para él.

  • Android, nueva lib de soporte 25, Implementación BottomNavigationView
  • "La actividad ha sido destruida" a veces cuando se puebla viewpager con fragmentos
  • Error de Android - Causado por: java.lang.NoClassDefFoundError: android.support.v4.util.SparseArrayCompat
  • Eclipse no reconoce android.support.v13.app.FragmentActivity aunque tengo la biblioteca android-support-v13
  • Barra de herramientas: botón de menú de desbordamiento siempre mostrando
  • Adición de bibliotecas de soporte técnico al proyecto de Android
  • DialogFragment: NullPointerException (biblioteca de soporte)
  • Biblioteca de soporte de Android lanzando una excepción de recursos no encontrados
  • Xamarin: No se encontró ningún recurso que coincida con los nombres (AppCompat)
  • Iconos de flecha de retroceso y desbordamiento de color incorrecto en dispositivos pre-Lollipop después de actualizar a la biblioteca de soporte 23.2.0
  • ¿Cómo puedo implementar el desplazamiento horizontal sin utilizar la biblioteca de soporte?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.