2012-07-05 30 views
10

tengo el siguiente problema:cómo mostrar un ListFragment existente en un DialogFragment

una He exisiting ListFragment, pero me gustaría ver esto como un cuadro de diálogo.

Mi primer acercamiento fue crear un DialogFragment que tiene a ListFragment dentro de él, pero al parecer actualmente no es posible poner fragmentos en fragmentos.

Extendiendo DialogFragment en lugar de ListFragment tampoco es posible, debido al uso intensivo de los métodos ListFragment.

¿Hay una manera fácil de hacer esto?

+0

También tengo problema similar. Y me sorprende que no pueda encontrar respuesta en ningún lado. Creo que es una tarea común, p. cuando desee visualizar la actividad de pantalla completa con Fragment in portrait, y el mismo Fragment como diálogo en el paisaje. –

+0

Terminé mostrando el ListFragment existente superponiendo el Main-Fragment en un Frame-Layout. Me parece bastante agradable en mi opinión, un poco como este: http://1.bp.blogspot.com/-f_1A98GQ1fU/T0bzdWnYIOI/AAAAAAAAUmA/MuRnT7-YU28/s1600/export_06.png – knaecke

+0

Tal vez este ejemplo: http: // stackoverflow.com/questions/12516626/listfragment-as-dialogfragment/16430898#16430898 – Hpsaturn

Respuesta

10

lo que funciona para mí es

1) en formato xml para su DialogFragment llamado, digamos, DialogFragmentwWithListFragment especifique ListFragment clase
P. ej. 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) invocar DialogFragmentwWithListFragment como DialogFragment regular:

DialogFragmentwWithListFragment dialogFragment = DialogFragmentwWithListFragment .newInstance(); 
dialogFragment.setRetainInstance(true); 
dialogFragment.show(getFragmentManager(), "tag"); 


Esperanza, que ayuda.

+0

Gracias, pero ¿qué pasa si necesitas' setArguments () 'al crear' DialogFragmentwWithListFragment' ?? –

3

Me o bien poner el ListView dentro de un DialogFragment o tratar de poner el ListFragment dentro de un Dialog. No estoy seguro si el segundo es posible.

+0

esto explota si lo ejecuto dos veces con: "Causado por: java.lang.IllegalArgumentException: archivo XML binario línea # 6: ID duplicado 0x7f09007b, etiqueta null, o id principal 0xffffffff con otro fragmento " – kenyee

3

Puede mostrar una lista a través de un DialogFragment esta manera: (usando 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 se amplía FragmentActivity e 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; 
     } 
} 
+0

Implementación mínima y otros arreglos: http://stackoverflow.com/questions/12516626/listfragment-as-dialogfragment/16430898#16430898 – Hpsaturn

0

Al añadir un fragmento dentro de otro fragmento, la documentación dice que debe hacerlo de forma dinámica (es decir, en lugar de codificar una etiqueta <fragment> en su XML diseño.

Así que aquí es cómo hacerlo de forma dinámica. 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 se verá, también contiene algunas funciones para establecer el título del cuadro de 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 posible crear una instancia del fragmento interno para pasarle cualquier argumento.

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

} 
Cuestiones relacionadas