Utilizar FragmentTransaction con un DialogFragment

Así que he creado un DialogFragment que se muestra como un diálogo a través de esta técnica

Ahora que se ha iniciado y en una interacción de usuario dentro de este popup quiero deslizar en otro fragmento a este diálogo. Estoy tratando de hacer esto a través de FragmentTransaction.add () donde le doy el id de uno de los contenedores en este diseño. En este punto obtengo:

java.lang.IllegalArgumentException: No view found for id 0x7f09013f for fragment <fragmentClassThatIWasPushingIn> 

Como una prueba rápida, traté de empujar a un identificador de contenedores no en el diálogo, pero dentro de la actividad de respaldo principal y que funcionó bien.

¿Hay algo sobre DialogFragments y sus identificadores de contenedor que no permiten FragmentTransactions?

Como un stopgap he dicho a mi transacción para ocultar el DialogFragment actual y mostrar este nuevo fragmento, pero la animación / pantalla es un poco chocante por lo que realmente me gustaría resolver este problema.

Gracias

Cuando un DialogFragment se muestra como un DialogFragment Dialog no es realmente un Fragment real en una vista de contenedor. Es un Fragment contenedores que es básicamente una envoltura de un Dialog .

Así que no, no se puede mostrar un Fragment dentro de un FragmentDialog . Si realmente quieres hacer esto, creo que la mejor manera de crear una nueva Activity estilo como un Dialog que puede agregar Fragments también.

DialogFragment tiene razón de que DialogFragment actúa como un diálogo, sin embargo se puede hacer que actúe como un fragmento con setShowsDialog(false);

Al final, lo siguiente funcionó para mí:

Archivo: res / layout / wifidirect_dialog_wifidirect:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:id="@+id/dialog_wifidirect_layout"> <LinearLayout android:id="@+id/frag_container" android:layout_width="match_parent" android:layout_height="250dp" android:orientation="vertical" > <!-- This is replaced during runtime --> <RelativeLayout android:id="@+id/frag_list" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="top" > </RelativeLayout> </LinearLayout> <!-- The Cancel Button --> <View android:layout_width="fill_parent" android:layout_height="1dp" android:layout_marginBottom="0dp" android:background="?android:attr/dividerVertical" /> <Button android:id="@+id/dialog_wifidirect_cancel" style="?android:attr/buttonBarButtonStyle" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/cancel"/> </LinearLayout> 

Archivo src /…/ WifiDirectDialog.java:

 public class WiFiDirectDialog extends DialogFragment { public static final String TAG = "WifiDirectDialog"; public static final String DEVICE_LIST_FRAGMENT_TAG = "WIFIDIRECT_DEVICE_LIST_FRAGMENT"; public static WiFiDirectDialog newInstance(){ WiFiDirectDialog wDialog = new WiFiDirectDialog(); //We want this Dialog to be a Fragment in fact, //otherwise there are problems with showing another fragment, the DeviceListFragment wDialog.setShowsDialog(false); //wDialog.setStyle(SherlockDialogFragment.STYLE_NORMAL,android.R.style.Theme_Holo_Light_Dialog); //We don't want to recreate the instance every time user rotates the phone wDialog.setRetainInstance(true); //Don't close the dialog when touched outside wDialog.setCancelable(false); return wDialog; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.v(TAG,"onCreateView"); View view = inflater.inflate(R.layout.wifidirect_dialog_wifidirect,container, false); //Log.v(TAG,"FragmentTransaction started"); ListFragment listFragment = new YourListFragment(); FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); transaction.addToBackStack(DEVICE_LIST_FRAGMENT_TAG) .replace(R.id.frag_list,deviceListFragment,DEVICE_LIST_FRAGMENT_TAG) .commit(); //Log.v(TAG,"FragmentTransaction finished"); return view; }; @Override public void onActivityCreated(Bundle savedInstanceState){ Log.v(TAG,"onActivityCreated"); super.onActivityCreated(savedInstanceState); Dialog dialog = getDialog(); dialog.setTitle(R.string.wifidirect_dialog_title); // Set button listeners etc.../// Button cancelButton = (Button) view.findViewById(R.id.dialog_wifidirect_cancel); cancelButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { dismiss(); } }); } 

Hay realmente un contenedor como se puede ver en el método onCreateView. Utiliza el contenedor para crear tu vista.

  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle) { Log.d(TAG, "onCreateView"); View v = inflater .inflate(R.layout.move_folder_dialog, container, false); 

Parece que el FragmentManager no es capaz de obtener el contenedor.

¿Podría ser esto un error?

  • Fragmentos: ¿cuál es el mejor lugar para medir vistas?
  • "Recurso esperado del menú de tipo" al inflar MenuButton
  • Recycler View No se muestra
  • ¿Cómo usar LoaderManager.LoaderCallbacks y CursorLoader para ORMLite?
  • Los fragmentos anidados desaparecen durante la animación de transición
  • OnActivityResult no se llama después de startIntentSenderForResult
  • AppCompat v7: ¿Debo usar Framework FragmentManager o SupportFragmentManager?
  • Cómo manejar onClick en Fragments
  • Lag al reemplazar el fragmento ViewPager en la barra de navegación sobre FrameLayout?
  • Espere con la operación hasta que se creen Vistas de fragmentos
  • ¿Utilizar BottomBar evita que se abran fragmentos?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.