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

 <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.

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(); } 
  • Ormlite Android inserciones masivas
  • Borrar backstack y reemplazar fragmento actual con un fragmento de nivel superior
  • ormlite para android: ayuda de diseño y más
  • ¿Cómo obtengo el mejor rendimiento con SQLite en Android?
  • Android: niveles de aislamiento de transacciones SQLite (ORMLite)
  • Fragmento no se muestra cuando el método add () se llama
  • Android - cuándo llamar a db.setTransactionSuccessful ()?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.