navegar - fragments dinamicos android studio
incluir list_content en el diseƱo de la lista para conservar la funcionalidad de ListFragment (3)
El ListFragment
incluido en la biblioteca de compatibilidad no parece usar ese diseño (list_content) como lo hace el real. Esto podría deberse a que se ofrece como un contenedor 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 de 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 vista, creo que está claro cuál sería considerado ''pirata'';)
En primer lugar, estoy usando la biblioteca de compatibilidad de Android V4 rev.3 para mi 1.6 (Donut)
Cuando creas un ListFragment por primera vez, muestra un indicador de progreso indeterminado hasta que uses setListAdabpter (). De acuerdo con la documentación de ListFragment.onCreateView, si quiero usar un diseño personalizado:
Si está anulando 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, de modo que continúe conservando todo el comportamiento estándar de ListFragment. En particular, esta es actualmente la única forma 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 valor ''@android: layout / list_content'').
Entiendo que list_content.xml
no existe en mi código fuente de V4. lo cual es correcto porque según los documentos apareció en API v11.
Simplemente asumí 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 de API V11 de Android y copiar y pegar list_content.xml
. Por el momento, sin embargo, me gustaría evitar esta piratería. ¿Es esta la única solución?
Me sentí frustrado al ver que el diseño de list_content no estaba disponible usando la biblioteca de soporte. Mi enfoque fue simplemente reutilizar el método onCreateView predeterminado de ListFragment y agregarlo 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;
}
Agregué un FrameLayout donde el ListView solía estar en mi diseño personalizado.
Una posible solución alternativa para incorporar el valor predeterminado @ android.R.layout / list_content en un diseño personalizado cuando se usa una biblioteca de compatibilidad es crear un ListFragment ficticio:
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);
}
}
Luego incluya este fragmento (en lugar del diseño recomendado de 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 de ListFragment y seguirá teniendo un diseño personalizado para él.