Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Agregar un fragmento como encabezado ListView

Estoy apuntando una aplicación androide a API 15 y mínimo 8. Así que uso la biblioteca de soporte para administrar fragmentos. Tengo un conjunto de fragmentos que utilizo en varias partes de la aplicación.

Ahora, en una actividad tengo un ListView en el diseño:

<ListView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/listOfEvents" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> 

Quisiera agregar un fragmento del mío en el encabezado ListView. He intentado esto:

  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.event_open); listOfEvents = (ListView) findViewById(R.id.listOfEvents); Fragment fragment = new SortingStandardFragment(); getSupportFragmentManager() .beginTransaction() .add(fragment, null) .commit(); View fragmentView = fragment.getView(); // problem: fragment is null! listOfEvents.addHeaderView(fragmentView); } 

Pero obtengo un error ya que fragment.getView () devuelve null (los documentos de referencia de api dicen que tengo que poner un GroupView Id en la llamada de adición, pero ¿dónde debo poner el GroupView en el diseño? ¿Hay otra manera de golpear la marca ?

  • Google Play Services 9.2.0 clases perdidas
  • Botón de acción flotante Android API 19 (KitKat)
  • Android DialogFragment onViewCreated no se llama
  • Android.support.v4.app.getFragmentManager () devuelve null?
  • Soporte para Android Barra de herramientas que no muestra la costumbre dibujable correctamente
  • Los fragmentos anidados desaparecen durante la animación de transición
  • Android.app Fragments vs. android.support.v4.app usando ViewPager?
  • Error al implementar la barra de acción de la biblioteca de soporte
  • 3 Solutions collect form web for “Agregar un fragmento como encabezado ListView”

    He resuelto esto mediante la creación de un nuevo diseño que contiene sólo el fragmento que necesito en el encabezado de la lista:

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/myFragmentEmbedded" android:name=".SortingStandardFragment" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> 

    Y en el código de actividad:

     LayoutInflater inflater = getLayoutInflater(); header = inflater.inflate(R.layout.myLayout, null); listOfEvents.addHeaderView(header); SortingStandardFragmenttitleFragment = (SortingStandardFragment) getSupportFragmentManager() .findFragmentById(R.id.myFragmentEmbedded); 

    Quería una versión sin tener que recurrir a otro archivo xml, así que aquí va:

     Fragment fragment = ... FrameLayout v = new FrameLayout(getActivity()); v.setId(42); listView.addHeaderView(v, null, false); FragmentManager fm = getActivity().getSupportFragmentManager(); fm.beginTransaction().add(v.getId(), fragment).commit(); 

    En caso de que alguien esté curioso por qué su primer intento falló:

    • Eventos de ciclo de vida se publican en el subproceso de interfaz de usuario
    • Fragment.onCreateView es un evento de ciclo de vida
    • Activity.onCreate es un evento de ciclo de vida
    • .getView() devuelve la vista creada en Fragment.onCreateView
    • commit un evento de ciclo de vida

    Conclusión: el resultado de commit es visible desde el siguiente bucle que es después de onCreate devuelto.

    Uno podría intentar forzar commit para ser inmediato con getSupportFragmentManager().executePendingTransactions() , después de leer la documentación en él.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.