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


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:

  • Androide. Obtener el tamaño de la imagen desde su id de recurso
  • Cómo insertar marca de tiempo en una columna de base de datos SQLite? Utilizando el tiempo de función ('ahora')?
  • Ionic android build Error - Error al encontrar la variable de entorno 'ANDROID_HOME'
  • Android obtiene la configuración actual, no predeterminada
  • Preferencia de la casilla de verificación Android
  • Cómo centralizar el diseño dentro de Android Dialog?
  •   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?

  • ¿Qué es layout_collapseParallaxMultiplier utilizado en CollapsingToolbarLayout?
  • ¿Cómo activar / desactivar WiFi desde una aplicación?
  • Barra de herramientas de Android: texto de título pequeño en modo horizontal
  • Establecer el intervalo de elementos en GridLayoutManager mediante SpanSizeLookup
  • Android: java.lang.OutOfMemoryError: Error al asignar una asignación de bytes 23970828 con 2097152 bytes libres y 2MB hasta OOM
  • ¿Se puede utilizar un LoaderManager de un servicio?
  • 2 Solutions collect form web for “Elementos en Fragmento no funcionan después de volver a agregar el mismo fragmento”

    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"); } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.