Fragmento de duplicación en la transacción de fragmentos
Ok, siempre que intento reemplazar un fragmento en mi aplicación, sólo agrega el fragmento dentro del contenedor del otro fragmento y deja el fragmento actual. He intentado llamar a reemplazar y hacer referencia a la vista que contiene el fragmento, y haciendo referencia al fragmento en sí. Ninguno de estos trabajos. Puedo añadir un fragmento a una vista con el gestor de transacciones de fragmentos, pero incluso si intento eliminarlo después de haber sido agregado, no funciona. Cualquier ayuda sería apreciada. Aquí están mis archivos.
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //Setup the actionabar. Use setDrawableBackground to set a background image for the actionbar. final ActionBar actionbar = getActionBar(); actionbar.setDisplayShowTitleEnabled(false); actionbar.setDisplayUseLogoEnabled(true); actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); actionbar.addTab(actionbar.newTab().setText(R.string.home_tab_text).setTabListener(this),true); actionbar.addTab(actionbar.newTab().setText(R.string.insert_tab_text).setTabListener(this)); Fragment fragment = new insert_button_frag(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.replace(R.id.button_fragment, fragment); transaction.addToBackStack(null); transaction.commit(); }
Aquí está el diseño
- SQLiteDatabase transacción anidada y solución alternativa
- Android: transacciones SQLite al usar ContentResolver
- Las inserciones de SQLite se vuelven más lentas incluso con transacciones
- Administrador de paquetes de Android ha muerto con TransactionTooLargeException
- ¿Está bien actualizar fragmentos en lugar de crear nuevas instancias?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="vertical" android:id="@+id/button_fragment_container" android:layout_width="fill_parent" android:layout_height="wrap_content" > <fragment android:name="com.bv.silveredittab.home_button_frag" android:id="@+id/button_fragment" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <fragment android:name="com.bv.silveredittab.quick_insert_frag" android:id="@+id/quick_insert_frag" android:layout_width="350dip" android:layout_height="fill_parent" /> <fragment android:name="com.bv.silveredittab.editor_frag" android:id="@+id/editor_frag" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> </LinearLayout>
Y aquí está el código del fragmento
public class insert_button_frag extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreate(savedInstanceState); return inflater.inflate(R.layout.insert_buttons,container, false); } }
Como he dicho. He tratado de referenciar la vista de fragmentos padre para reemplazarlo, y el fragmento sí mismo (por id) y aún, sólo añade el nuevo fragmento, dentro de la vista que contiene el fragmento original está en.
- La transacción de Sqlite bloquea Android ui
- La transacción de Firebase no aborta remotamente si previamente se ha comprometido localmente
- ¿El yieldIfContendedSafely () pierde los beneficios de una transacción?
- ¿Las transacciones SQLite con ContentOrter de Google IO REST?
- BeginTransaction (), endTransaction () y setTransactionSuccessful (). ¿Qué hacen exactamente?
- Transacción de la base de datos Android
- ¿Debo usar siempre transacciones en android sqlite?
- Fragmento Transacciones con transición - Los nombres de transición únicos son necesarios
He resuelto esto mediante el uso de un marcador de posición en mi diseño y, a continuación, adjuntar mi fragmento a ella en tiempo de ejecución.
Al igual que usted, si instancié mi Fragmento dentro de mi diseño xml, entonces el contenido permanecería visible después de reemplazarlo con otro Fragmento en tiempo de ejecución.
El problema es esta línea:
transaction.replace(R.id.button_fragment, fragment);
replace
tiene dos formularios sobrecargados. En ambos, el primer argumento es el contenedor del Fragmento que se va a reemplazar, no el Fragmento en sí. Así que, en su caso, tiene que llamar
transaction.replace(R.id.button_fragment_container, fragment);
Editar: Veo en su pregunta que ha intentado ambos. He probado y verificado el comportamiento. Esto parece ser un error en la API FragmentTransaction.
Edit2: no es un error después de todo. Simplemente no puede reemplazar fragmentos añadidos estáticamente en un archivo de diseño. Sólo se pueden reemplazar los que se han agregado mediante programación ( Android: no se puede sustituir un fragmento por otro )
Tuve el mismo problema. Echa un vistazo a este enlace: Android Fragment Duplication
Me pregunto si el hecho de que usted está pasando el contenedor en el método inflater.inflate () hace que crear el nuevo fragmento dentro de la antigua en lugar de un reemplazo al por mayor. He estado proporcionando 'nulo' a mis infladores en la versión de trabajo.
Aquí está lo esencial de la versión que tengo trabajando …
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ View newFrag = new View(getActivity().getApplicationContext()); newFrag = inflater.inflate(R.id.frag, null); return newFrag; }
La guía de desarrolladores de Google es bastante confuso porque muestra primero a implementar el fragmento codificado en su xml. Pero si realmente quieres reemplazar el fragmento existente con el nuevo, entonces debes agregarlo (el primero) en tiempo de ejecución.
Qué estado oficial del sitio es
FragmentTransaction reemplazar (int containerViewId, Fragment fragmento, String tag)
Reemplazar un fragmento existente que se agregó a un contenedor. Esto es esencialmente lo mismo que llamar a remove (Fragment) para todos los fragmentos agregados actualmente que se agregaron con el mismo containerViewId y luego agregar (int, Fragment, String) con los mismos argumentos que se dan aquí.
Usted debe notar que dice que Reemplazar un fragmento existente que se agregó a un contenedor
Por lo tanto, su xml debe verse como someActivity.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ... tools:context="someActivity"> <ImageView .../> <LinearLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="bottom"/> </RelativeLayout>
Y que en tu actividad en OnCreate ()
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); [...] getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, new FirstFragment).commit(); }
Que usted puede reemplazar fácilmente el fragmento con sus animaciones y el evento lo agrega a la pila trasera para guardar su estado.
private SecondFrag getSecondFrag(){ if(secondFrag == null) secondFrag = new SecondFrag() return secondFrag; } private void openRechargeFragment(){ FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.show_frag, R.anim.hide_frag, R.anim.show_frag, R.anim.hide_frag); ft.replace(R.id.fragment_container, getSecondFrag(), "myTAG"); ft.addToBackStack(null); ft.commit(); }
- No se puede emitir Proveedor de acciones para compartir el proveedor de acciones
- ¿Cómo cancelar un diálogo temático como Actividad cuando se toca fuera de la ventana?