Cómo mostrar un ListFragment existente en un DialogFragment
Tengo el siguiente problema:
Tengo un ListFragment
, pero quisiera exhibir esto como diálogo.
- Popup en android?
- SurfaceView no funciona dentro de PopupWindow
- Cómo desenfocar / atenuar una actividad cuando se muestra una ventana emergente en android
- Custom PopupWindow con el método despreciado BitmapDrawable
- Ventana Popup de Android Pantalla completa
Mi primer enfoque fue crear un DialogFragment
que tiene que ListFragment
dentro de él, pero aparentemente actualmente no es posible poner fragmentos en fragmentos.
Extender DialogFragment
lugar de ListFragment
también no es posible, debido al uso ListFragment
métodos ListFragment
.
¿Hay una forma fácil de hacer esto?
- OnAnimationEnd no se llama, onAnimationStart funciona bien
- Orden de PopupWindow z
- Android: Ventana emergente: Se ha intentado finalizar un evento de entrada pero el receptor de eventos de entrada ya se ha eliminado
- Reproductor de vídeo flotante (como el reproductor de youtube) en android
- Android PopupWindow se oculta detrás de los botones de navegación en Nexus 5
- Cambiar el color de fondo cuando se muestra una ventana emergente
- Desactivación de ventana emergente de Android
- Cómo establecer el ancho de la ListView en un PopupWindow en Android?
Lo que funciona para mi es
1) en la disposición del xml para su DialogFragment llamado, digamos, DialogFragmentwWithListFragment especifica la clase de ListFragment
Por ejemplo, dialog_fragment_with_list_fragment.xml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/flContent" android:layout_width="match_parent" android:layout_height="match_parent" android:padding = "10dp" class="com.xxx.yyy.DialogFragmentwWithListFragment " /> </LinearLayout>
2) en DialogFragmentwWithListFragment inflar dialog_fragment_with_list_fragment.xml
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.dialog_fragment_with_list_fragment, null); }
3) invoca DialogFragmentwWithListFragment como regular DialogFragment:
DialogFragmentwWithListFragment dialogFragment = DialogFragmentwWithListFragment .newInstance(); dialogFragment.setRetainInstance(true); dialogFragment.show(getFragmentManager(), "tag");
Espero eso ayude.
Yo pondría el ListView
dentro de un DialogFragment
o intentar poner el ListFragment
dentro de un ListFragment
Dialog
. No estoy seguro si la segunda es posible sin embargo.
Puede mostrar una lista a través de un DialogFragment
esta manera: (utilizando la biblioteca de soporte v4)
public class MyListDialogFragment extends DialogFragment { onDlgListClick mCallback; private String[] lista;//the list you want to show with the dialog public static MyListDialogFragment newInstance(Bundle fB){ MyListDialogFragment lstFrag = new MyListDialogFragment(); Bundle args = new Bundle(); args.putStringArray("lista", fB.getStringArray("lista"));//the list args.putString("titulo", fB.getString("titulo"));//the title of the list lstFrag.setArguments(args); return lstFrag; } public interface onDlgListClick{ public void onLstItemSelected(String selection); } @Override public void onAttach(Activity activity) { super.onAttach(activity); // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception try { mCallback = (onDlgListClick) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement onLstItemSelected"); } this.setCancelable(false); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { lista = getArguments().getStringArray("lista"); return new AlertDialog.Builder(getActivity()) .setTitle(getArguments().getString("titulo")) .setCancelable(false) .setItems(lista, new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog, int item){ mCallback.onLstItemSelected(lista[item]); getDialog().dismiss(); //maybe you dont need these two lines MyListDialogFragment.this.dismiss(); } }).create(); } }
En la actividad principal se extiende FragmentActivity
y se implementa la interfaz MyListDialogFragment.onDlgListClick
//the interface @Override public void onLstItemSelected(String selection) {//list dialog fragment interface //do whatever you want } //calling the dialog public void showFrags(int id){ Bundle fB = new Bundle(); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); Fragment prev = getSupportFragmentManager().findFragmentByTag("listdialog"); if (prev != null) { ft.remove(prev); } ft.commit(); switch(id){ case 0: fB.putStringArray("lista", list); fB.putString("titulo",title); MyListDialogFragment newListDlg = MyListDialogFragment.newInstance(fB); newListDlg.show(ft, "listdialog"); break; } }
Al agregar un fragmento dentro de otro fragmento, la documentación dice que debe hacerlo dinámicamente (es decir, en lugar de codificar una etiqueta <fragment>
en el XML de su diseño.
Así que aquí es cómo hacerlo dinámicamente. En este caso, agrego MyListFragment
a MyDialogFragment
:
MyDialogFragment.java
import android.app.Dialog; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; public class MyDialogFragment extends DialogFragment { public static final String TAG = MyDialogFragment.class.getSimpleName(); private static final String ARG_TITLE = "ARG_TITLE"; private EditText mEditText; public MyDialogFragment() { // Empty constructor required for DialogFragment } public static MyDialogFragment newInstance(String title) { MyDialogFragment myDialogFragment = new MyDialogFragment(); Bundle args = new Bundle(); args.putString(ARG_TITLE, title); myDialogFragment.setArguments(args); return myDialogFragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = super.onCreateDialog(savedInstanceState); Bundle args = getArguments(); if (args != null) { dialog.setTitle(args.getString(ARG_TITLE)); } return dialog; } public void setTitle(String title) { Dialog dialog = getDialog(); dialog.setTitle(title); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.dialog_fragment_selected_products, container, false); //addInnerFragment(); Button okButton = (Button)view.findViewById(R.id.okButton); okButton.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { dismiss(); //dismissAllowingStateLoss(); } } ); return view; } @Override public void onStart() { super.onStart(); //addInnerFragment(); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); addInnerFragment(); } public void addInnerFragment() { FragmentManager childFragmentManager = getChildFragmentManager(); FragmentTransaction transaction = childFragmentManager.beginTransaction(); //transaction.add(R.id.fragmentContainer, new MyListFragment()); transaction.add(R.id.fragmentContainer, MyListFragment.newInstance(MyListFragment.MODE_SELL)); //transaction.commit(); transaction.commitAllowingStateLoss(); childFragmentManager.executePendingTransactions(); } }
(Como verá, también contiene alguna funcionalidad para establecer el título del diálogo.)
Dialog_fragment_selected_products.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MyDialogFragment" android:orientation="vertical"> <LinearLayout android:id="@+id/fragmentContainer" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_alignParentTop="true" android:layout_above="@+id/okButton" /> <Button android:id="@+id/okButton" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="@string/ok" /> </RelativeLayout>
Otra ventaja de hacerlo de esta manera es que se puede crear una instancia del fragmento interno para pasar cualquier argumento a la misma.
Para completar, aquí está el código que utilizo en mi actividad para mostrar el DialogFragment:
MyActivity.java
private void showCurrentItemsDialog() { MyDialogFragment myDialogFragment = MyDialogFragment.newInstance("cpuk.org"); //myDialogFragment.setRetainInstance(true); FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.add(myDialogFragment, MyDialogFragment.TAG); transaction.commitAllowingStateLoss(); fragmentManager.executePendingTransactions(); }
- Vinculación / desvinculación a un servicio en una aplicación
- Principiante Programador Interesado en Android – ¿Debo comenzar con Java?