Fragmento ya activo – Al intentar establecerArgumentos
Estoy usando el ejemplo dar en el siguiente enlace
Http://android-er.blogspot.in/2013/04/handle-onlistitemclick-of-listfragment.html
- Borrar backstack y reemplazar fragmento actual con un fragmento de nivel superior
- ScrollView> LinearLayout> PreferenceFragment es altura cero
- Fragmentos en viewpager, no se encontró error de vista
- Android - Fragment API para nivel de API <11
- Pase entre actividades
Aquí tengo dos clases una que extiende el fragmento de la lista y el otro fragmento que extiende. Ahora estoy pasando objeto a detailfragment de esta manera:
* De ListFragment *
@Override public void onListItemClick(ListView l, View v, int position, long id) { Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); Bundle bundle = new Bundle(); bundle.putSerializable(BUNDLE_KEY, obj);// passing this object detailFragment.setArguments(bundle); detailFragment.setUpLayout();// update the UI }
Ahora en la clase Fragmento lo recibo, objetivo básico es actualizar la interfaz de usuario del fragmento basado en el elemento seleccionado en el fragmento de lista, esa es la razón por la que estoy enviando el objeto
Bundle b = getArguments(); b.getSerializable(BUNDLE_KEY);
Ahora en el artículo seleccionado dice "Fragmento ya activo".
Cuál es el problema aquí? ¿Qué estoy haciendo mal?
- no alcanzable después de usar .getActivity () en un fragmento
- ViewPager + FragmentStatePagerAdapter + cambio de orientación
- FindViewById devuelve NULL cuando se utiliza Fragment
- Android: El nuevo método getContext () de Fragment es qué contexto?
- Android: la pantalla del fragmento gira
- ¿Cuándo se llama a onActivityResult del fragmento con respecto al ciclo de vida de los fragmentos?
- Animador de animación personalizada
- KeyEvent.KEYCODE_BACK se llama dos veces en Fragmento
Otra solución es crear un constructor vacío para su fragmento.
public Detailfragment() { super(); // Just to be an empty Bundle. You can use this later with getArguments().set... setArguments(new Bundle()); }
Y en el método onListItemClick usas ese lote:
@Override public void onListItemClick(ListView l, View v, int position, long id) { Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); // Update the keys. detailFragment.getArguments().putSerializable(BUNDLE_KEY, obj);// passing this object detailFragment.setUpLayout();// update the UI }
Ahora puede llamar a getArguments () methond en su método setUpLayout ().
Desde el Android oficial de desarrollo Referencia:
Public void setArguments (Bundle args) Suministre los argumentos de construcción para este fragmento. Esto sólo puede ser llamado antes de que el fragmento se haya unido a su actividad; Es decir, debe llamar inmediatamente después de construir el fragmento. Los argumentos suministrados aquí serán retenidos a través de la destrucción y creación de fragmentos.
Su fragmento ya está unido a su actividad le sugiero que utilice su propio método, no necesita setArguments!
Cree sus propios setUIArguments (Bundle args) dentro de la clase fragment y actualice la UI del fragmento dentro de este método
Usted llamará a este método de esta manera:
@Override public void onListItemClick(ListView l, View v, int position, long id) { Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); Bundle bundle = new Bundle(); bundle.putSerializable(BUNDLE_KEY, obj);// passing this object detailFragment.setUIArguments(bundle); /* your new method */ }
En tu clase de fragmentos
public void setUIArguments(Bundle args) { getActivity().runOnUiThread(new Runnable() { public void run() { /* do your UI stuffs */ } } }
Puede comprobar si ya hay argumentos y, si es así, simplemente agregue / actualice.
private static void initFrag(Fragment frag, Bundle args) { if (frag.getArguments() == null) { frag.setArguments(args); } else { //Consider explicitly clearing arguments here frag.getArguments().putAll(args); } }
Opcionalmente, puede que desee eliminar argumentos existentes si no puede asumir con seguridad que los argumentos preexistentes siguen siendo válidos.
Esta variable global:
private FragmentManager fragmentmanager; private FragmentTransaction fragmenttransaction;
Estos códigos se insertan en el "List Fragment" onCreate () Actividad:
fragmenttransaction = fragmentmanager.beginTransaction(); fragmenttransaction.replace(detailFragmentID, detailFragment, "test"); fragmenttransaction.addToBackStack(null); fragmenttransaction.commit();
Estos son Drawerlistitem click event:
@Override public void onListItemClick(ListView l, View v, int position, long id) { Bundle bundle = new Bundle(); fragmenttransaction = fragmentmanager.beginTransaction(); if(fragmentmanager.findFragmentById("test") != null) { fragmenttransaction.remove(fragmentmanager.findFragmentByTag("test")); } Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); bundle.putSerializable(BUNDLE_KEY, obj);// passing this object detailFragment.setArguments(bundle); fragmenttransaction.replace(detailFragmentID, detailFragment, "test"); fragmenttransaction.addToBackStack(null); fragmenttransaction.commit(); }
Ahora extiende el código del fragmento como es:
Bundle b = getArguments(); b.getSerializable(BUNDLE_KEY);
Método público del fragmento de diálogo
public void setBundle(final Bundle bundle) { final Bundle arguments = getArguments(); arguments.clear(); arguments.putAll(bundle); }
Mostrar o actualizar el fragmento de diálogo
public void showMessageDialogue(final String tag, final Bundle bundle) { final Fragment fragment = mFragmentManager.findFragmentByTag(tag); if (fragment != null && fragment instanceof MessageDialogueFragment) { ((MessageDialogueFragment) fragment).setBundle(bundle); } else { final MessageDialogueFragment messageDialogueFragment = new MessageDialogueFragment(); messageDialogueFragment.setArguments(bundle); messageDialogueFragment.show(mFragmentManager, tag); } }
- Establece loadURLTImeOutValue en la vista web
- Cómo aplicar un estilo de vista grande a una notificación mediante la biblioteca Parse