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:
- Android Listview mantiene los elementos antiguos después de los cambios del adaptador
- Reemplazar un fragmento con otro en ViewPager
- ¿Cómo puedo seleccionar el elemento seleccionado en Android ListView?
- ¿Los servicios del sistema no están disponibles para las actividades antes de crear?
- Custom ListView Android
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?
- Gran número de TextViews un éxito de rendimiento? ¿Debo cambiar a ListView en lugar de usar Scrollview?
- Relleno ListView en desplazamiento
- Cuando los listitems se desplazan rápidamente, setOnScrollListener no funciona
- OnItemLongClickListener no funciona en una vista de lista personalizada
- Filtrado personalizado en Android con ArrayAdapter
- Tire para actualizar y cargar en listview
- ¿Cómo crear un ListView cerrado (circular)?
- Cómo agregar encabezados de sección pegajosa en listview?
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"); } }