2011-06-27 5 views
15

Estoy convirtiendo una aplicación existente a la API de Fragments utilizando la biblioteca de compatibilidad. He leído que se supone que debes actualizar las clases que amplían la Actividad para usar ahora FragmentActivity. Esto está bien para la mayoría de los casos, pero ¿qué pasa con las clases que extienden ListActivity o MapActivity? ¿Cuál es la forma preferida de manejar esto? Esperaba que hubiera ListFragmentActivity o algo así, pero no veo ninguno.¿Qué hacer con ListActivity/MapActivity al convertir a Fragments utilizando la biblioteca de compatibilidad?

Respuesta

5

Hay una ListFragment: http://developer.android.com/reference/android/app/ListFragment.html

Para MapActivity, por desgracia, tendrá que seguir utilizándola; no hay Fragmento API para eso.

+2

Gracias, pero ListFragment no es un FragmentActivity, entonces estoy teniendo problemas con mi estructura de herencia que espera una FragmentActivity. Cuanto más trabajo en esto, más parece que necesitará una reescritura total, no solo actualizar los tipos de clases y los ajustes menores como Google afirmó. – CACuzcatlan

+2

@CACuzcatlan: le invitamos a citar un enlace donde "Google" "reclamó" que todo lo que necesita es "simplemente actualizar tipos de clases y ajustes menores". Dicho esto, convertir una 'ListActivity' a' ListFragment' es bastante simple, más simple que la mayoría de las actividades-> migraciones de fragmentos, en mi humilde opinión. – CommonsWare

+0

Lo siento, exageré. Debo decir que esa fue la impresión que tengo. – CACuzcatlan

8

Al menos por el ListActivity Puede cambiarlo a FragmentActivity (Aún implementar OnItemCLickListener) y reemplazar:

lv = getListView() a LV = (Lista) findViewById (R.id.your_list_view_id)

y

setListAdapter (favAdapter) para lv.setAdapter (adaptador)

+2

Si el ID de su ListView es '@ android: id/list', puede hacer esto: 'ListView lv = (ListView) findViewById (android.R.id.list);'. También querrás reemplazar 'onListItemClick()' con 'lv.setOnItemClickListener (new ListView.OnItemClickListener() {...' – bmaupin

+1

Comenté esto también con la respuesta de @bmaupin, pero ¿podemos simplemente hacer los métodos? GetListView() "que devuelve" (ListView) findViewById (R.id.your_list_view_id) "y" setListAdapter (adaptador) "que hace" getListView(). setAdapter (adapter) "para encargarse de esas cosas o ¿no funcionaría? – ankushg

+0

@Ankush también funcionaría. Usted buscará en la jerarquía de vistas cada vez que llame a getListView(), que es marginalmente menos eficiente. –

12

Esto es lo que hago cuando la conversión de un ListActivity a los fragmentos de API:

  1. Reemplazar lv = getListView(); con lv = (ListView) findViewById(android.R.id.list);

  2. Reemplazar setListAdapter(adapter); con lv.setAdapter(adapter);

  3. Si ha anulado onListItemClick(), reemplazarlo con lv.setOnItemClickListener(new ListView.OnItemClickListener() {...

  4. Vas a tener que establecer la vista vacía (espectáculos cuando no hay resultados) manualmente: lv.setEmptyView(findViewById(android.R.id.empty));

    Si estoy usando CursorLoader, que normalmente poner esto en onLoadFinished():

    // if there are no results 
    if (data.getCount() == 0) { 
        // let the user know 
        lv.setEmptyView(findViewById(android.R.id.empty)); 
    } else { 
        // otherwise clear it, so it won't flash in between cursor loads 
        lv.setEmptyView(null); 
    } 
    
  5. Hablando de cursor loaders, también voy a convertir la actividad de usar CursorLoader si no está ya en ese momento

+1

¿Sería suficiente agregar un nuevo método getListView() a la FragmentActivity que devolvió ListView? y luego agregue otro método setListAdapter (adaptador) que llamó a setAdapter (adaptador) en esa actividad? – ankushg

+0

Su solución funcionó a la perfección, thx 4 compartirlo! – vinidog

+0

@Ankush que funcionaría también. Usted será searchi ng la jerarquía de vista cada vez que llama a getListView(), que es marginalmente menos eficiente. –

0

Es posible convertir ListActivity en FragmentActivity.

  1. Extender FragmentActivity en lugar de ListActivity
  2. Crear res/layout/your_activity.xml con un vacío ListView con android:id="@+id/your_activity_list_view"
  3. En el onCreate de su actividad, setContentView(R.layout.your_activity);
  4. también cambiar la onCreate de su actividad para recuperar explícitamente la ListView que acaba inflado

.

ListView lv = (ListView) findViewById(R.id.your_activity_list_view); 
lv.setAdapter(adapter); 
lv.setOnItemClickListener(this); 
Cuestiones relacionadas