style life example custom create activity android android-3.0-honeycomb android-fragments

android - life - dialogfragment custom layout example



Usar FragmentTransaction con un DialogFragment (3)

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

Ahora que se lanzó y sobre la interacción del usuario dentro de esta ventana emergente, quiero deslizar otro fragmento a este cuadro de 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 insertarlo en una identificación de contenedor no en el diálogo sino dentro de la actividad principal de respaldo y funcionó bien.

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

Como medida provisional, le dije a mi transacción que ocultara el DialogFragment actual y mostrara este nuevo fragmento, pero la animación / pantalla es un poco discordante, así que realmente me gustaría solucionar este problema.

Gracias


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

Entonces no, no puedes mostrar un Fragment dentro de un FragmentDialog . Si realmente quieres hacer esto, creo que la mejor manera sería crear una nueva Activity diseñada como un Dialog que luego puedes agregar también.


existe realmente un contenedor como se puede ver en el método onCreateView. Usas 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 FragmentManager no puede obtener el contenedor.

¿Podría ser esto un error?


alexanderblom tiene razón en 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(); } }); }