2011-10-22 12 views
16

En primer lugar, estoy usando el Rev. 3 de compatibilidad Android Biblioteca V4 para mi 1.6 (Donut)incluyendo list_content en diseño de lista para retener funcionalidad ListFragment

Cuando se crea un ListFragment se muestra un indicador de progreso indeterminado hasta el usted usa setListAdabpter(). De acuerdo con la documentación de ListFragment.onCreateView, si quiero usar una costumbre distribución:

Si está sustituyendo este método con su propio contenido personalizado, considerar la inclusión de la disposición estándar {@ link android.R .layout # list_content} en su archivo de diseño, para que continúe manteniendo todo el comportamiento estándar de ListFragment. En en particular, esta es actualmente la única forma de que se muestre el estado de progreso indeterminante incorporado.

El problema es que cuando entro en mi archivo de diseño y trato: <include layout="@android:layout/list_content" ...> que (Eclipse) me dice que

de recursos no es pública. (en 'layout' con el valor '@android: layout/list_content').

Supongo 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 código fuente V11 API de Android y copiar y pegar list_content.xml. Por ahora, sin embargo, me gustaría evitar esta piratería. ¿Es esta la única solución?

+0

¿Encontró una solución para esto? Estoy teniendo el mismo problema. – Yuyo

+0

@Yuyo Terminé no usando un diseño personalizado (la pereza en realidad), pero como dijeron Antonyte y yo, solo puedes copiar el 'list_content.xml' en tu proyecto. No es hackeo, de hecho, es la mejor manera de hacerlo si no desea comenzar a escribir líneas de código para lograr el mismo efecto. –

Respuesta

8

El ListFragment incluido en la biblioteca de compatibilidad no parece usar ese diseño (list_content) como el real. Esto podría deberse a que se ofrece como un contenedor y no es posible agrupar recursos. Estos son 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 posibilidad de elegir entre copiar el archivo de diseño de la fuente APIv11 y la inclusión de este ver el código de inicialización, creo que está claro cuál se consideraría 'piratería';)

1

One possib Le solución alternativa para incorporar por defecto @ android.R.layout/list_content en diseño personalizado al utilizar biblioteca de compatibilidad es crear un ListFragment dummy:

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); 
    } 
} 

Entonces incluyendo este fragmento (en lugar de la disposición list_content recomendada) 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 totalmente funcional del ListFragment sin dejar de tener un diseño personalizado para él.

2

Me sentí frustrado al ver que el diseño list_content no estaba disponible utilizando la biblioteca de soporte. Mi enfoque era simplemente volver a utilizar el método predeterminado onCreateView del ListFragment y añadirlo como una 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; 
} 

he añadido un FrameLayout donde el ListView solía ser en mi diseño personalizado.

+1

He subido la cantidad porque parecía que esta sería la única forma de conservar la vista predeterminada "Cargando/Progreso indeterminado" con setListShown (falso). Desafortunadamente resulta que ListFragment de la biblioteca de soporte simplemente no admite esa vista de progreso cuando se combina con la vista de la lista vacía (@ id/android: empty). La implementación [aquí] (https://android.googlesource.com/platform/frameworks/support/+/master/v4/java/android/support/v4/app/ListFragment.java#335) solo intenta encontrar un vista vacía personalizada si no se crea la predeterminada. – tangobravo

+0

¿No podemos simplemente usar contenedor en lugar de llamar a findViewById. Ahí es donde le estamos diciendo a Android que ya coloque el ListView. – wheredidthatnamecomefrom

Cuestiones relacionadas