Elementos en Fragmento no funcionan después de volver a agregar el mismo fragmento

UPDATE : He encontrado el encabezado no es la única cosa afectada, pero los listeners y otros elementos en el fragmento no se están inicializando. (Como los FAB). Las únicas cosas que funcionan correctamente es cualquier cosa construida dentro del adapter (es decir, las filas ListView )

El problema : Abrir el cajón Nav, haga clic en un elemento de la lista que abre un nuevo Fragment en la misma Activity . Abra de nuevo el Nav Drawer, haga clic en el mismo elemento que simplemente debe reemplazar el Fragment existente y mientras el Fragment se abre, todos los elementos que se establecen mediante programación en Java (texto, colores, oyentes) no se cambian / añaden al Fragment . La vista es simplemente el diseño xml predeterminado. He confirmado con Log.d que el código que establece estas cosas se está ejecutando. (Si abre un Fragment diferente y luego regresa al original, todo funciona bien)

La causa confirmada: Al cambiar esto:

  compile "com.android.support:appcompat-v7:25.0.1" compile 'com.android.support:design:25.0.1' 

a

  compile "com.android.support:appcompat-v7:25.1.0" compile 'com.android.support:design:25.1.0' 

(Si sólo se cambia una de estas bibliotecas, no importa cuál, el problema sigue ocurriendo)

He confirmado el cambio de estas dos bibliotecas es el problema (también confirmó este problema en una segunda aplicación – y cambiar sólo este código, tiene el mismo resultado)

Mis preguntas son , ¿por qué está sucediendo esto y cómo se puede arreglar?

El Código y una descripción más detallada de la pregunta original:

  FragmentTransaction tItems = fm.beginTransaction(); ListFragment mFrag = new PlannerFragment(); tItems.replace(R.id.main_frag, mFrag, TAG_CALC_FRAGMENT); tItems.commit(); 

Hay cerca de 4 opciones en mi cajón que abren todo este Fragmento, pero antes de cada una, establezco una variable global como esta:

 MyApp.PlanType = "highbal"; MyApp.PlanType = "lowbal"; etc. 

Basado en el valor de PlanType (arriba), ese Fragment se carga con datos diferentes (pero, en el mismo xml layouts). Es simplemente un ListView con un encabezado.

Este Fragment , ( PlannerFragment ) carga bien la primera vez.

Cuando hago clic en otro elemento (un PlanType diferente) que va al mismo Fragment (el mismo código anterior ejecutado): El ListView carga multa en la lista real. Pero en el header de la lista, ninguno de los valores setText() establece los nuevos datos correctamente. Utiliza los valores predeterminados de mi diseño xml .

Ahora, si carga un Fragment diferente en medio, todo funciona muy bien. Es sólo cuando yo o bien añadir o reemplazar (he intentado ambos) el mismo Fragment en la parte superior de la antigua hace que esto suceda.

Aquí está el código de encabezado en la parte superior de PlannerFragment

 @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Setup listview lv = getListView(); LayoutInflater inflaterHeader = getActivity().getLayoutInflater(); ViewGroup header = (ViewGroup) inflaterHeader.inflate(R.layout.planner_listview_header, lv, false); lv.addHeaderView(header, null, false); // Load Data then Set Textviews, eg: TextView title = (TextView) getActivity().findViewById(R.id.tvPlannerTitle); dateOutput = (TextView) getActivity().findViewById(R.id.tvDebtOutDate); 

Si agrego a ese código, dateOutput.setText("test"); eso no pasa. Puedo hacer un Log.d y mis registros de datos, por lo que este código se está leyendo, pero la interfaz de usuario no está establecido.

Incluso he intentado quitar el Fragment primero como esto con un cheque:

  Fragment fragment = fm.findFragmentByTag(TAG_CALC_FRAGMENT); if(fragment != null) fm.beginTransaction().remove(fragment).commit(); 

Esto no tiene efecto.

Una vez más, esto ocurrió SOLAMENTE cuando cambié las bibliotecas arriba. ¿Es esto un error con la biblioteca o ahora responde de manera diferente?

Hay muchos cambios y problemas con Fragments en appcompat 25.1.0 . El primero parece relacionado con su problema, pero los dos siguientes deben ser leídos, ya que puede ser importante.


FragmentTransaction reemplaza el comportamiento

Reemplazar no funciona correctamente en appCompat 25.1.0
Estado actual (Jan 4 2017): error asignado
Enlace de problema


Cambio del ciclo de vida del fragmento en 25.1.0

OnStart en el nuevo Fragment se llama antes onStop en el anterior
Estado actual : funciona como se esperaba. Para mí podría ser un cambio de ruptura desde app app 25.0.x.

También hay un problema con el evento de reanudar llamado dos veces en fragmento, vea aquí .

TLDR. Tal vez la mejor solución temporal es no usar 25.1.0 hasta que se acabe una nueva versión.

Puede agregar list_view_header.xml en el método navigationDrawer() y cambiar la posición del elemento seleccionado como selectItem(position - 1) .

  private void navigationDrawer() { mTitle = mDrawerTitle = getTitle(); // mNavigationDrawerItemTitles = getResources().getStringArray(R.array.navigation_drawer_items_array); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerList = (ListView) findViewById(R.id.left_drawer); LayoutInflater inflater = getLayoutInflater(); View listHeaderView = inflater.inflate(R.layout.list_view_header, null, false); mDrawerList.addHeaderView(listHeaderView, null, false); setupToolbar(); DataModel[] drawerItem = new DataModel[6]; drawerItem[0] = new DataModel(R.drawable.dashboard_icon, "Dashboard"); drawerItem[1] = new DataModel(R.drawable.cal_icon, "Calender"); drawerItem[2] = new DataModel(R.drawable.classes, "Classes"); drawerItem[3] = new DataModel(R.drawable.message_icon_hdpi, "Message Center"); drawerItem[4] = new DataModel(R.drawable.profile, "Profile & Setting"); drawerItem[5] = new DataModel(R.drawable.bulletin_icon, "Bulletin Board"); getSupportActionBar().setDisplayHomeAsUpEnabled(false); getSupportActionBar().setHomeButtonEnabled(true); DrawerItemCustomAdapter adapter = new DrawerItemCustomAdapter(this, R.layout.list_view_item_row, drawerItem); mDrawerList.setAdapter(adapter); mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerLayout.setDrawerListener(mDrawerToggle); setupDrawerToggle(); } private class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { selectItem(position - 1); } } private void selectItem(int i) { Fragment fragment = null; switch (i) { case 0: fragment = new Fragment_DashBoard(); // toolbar.setTitle("Dashboard"); Titletv.setText("Dashboard"); break; case 1: fragment = new Fragment_Calender(); // toolbar.setTitle("Calender"); Titletv.setText("Calender"); break; case 2: fragment = new Fragment_Classes(); // toolbar.setTitle("Classes"); Titletv.setText("Classes"); break; case 3: fragment = new Fragment_MessageCenter(); // toolbar.setTitle("Message"); Titletv.setText("Messages"); break; case 4: fragment = new Fragment_ProfileSetting(); // toolbar.setTitle("Profile"); Titletv.setText("Profile"); break; case 5: fragment = new Fragment_BulletinBoard(); //toolbar.setTitle("Bulletin Board"); Titletv.setText("Bulletin Board"); break; default: break; } if (fragment != null) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction trans = fragmentManager.beginTransaction(); fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(null).commit(); mDrawerList.setItemChecked(i, true); mDrawerList.getItemAtPosition(i); // setTitle(mNavigationDrawerItemTitles[position]); mDrawerLayout.closeDrawer(mDrawerList); } else { Log.e("MainActivity", "Error in creating fragment"); } } 
  • Imagen que se muestra en Android Studio pero no en el teléfono
  • ¿Cómo puedo hacer que un elemento específico del cajón de navegación aparezca seleccionado?
  • ¿Cómo puedo configurar onClickListener en ArrayAdapter?
  • Cambiar el color de fondo de los elementos de ListView en Android
  • Android ListView scrollbarStyle
  • Listview no muestra nada y ocultar datos
  • ¿Cómo afectar a elementos fuera de un listview cuando se hace clic en algunos elementos de la vista de lista?
  • Cómo hacer que el encabezado o pie de página de un ListView no se puede hacer clic
  • Cómo establecer el color de fila alternativo de Listview y el color de fondo del elemento seleccionado
  • Listview - Pie de página en la parte inferior de la pantalla
  • El efecto Ripple no va por encima de ImageView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.