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();
}
});
}