2012-07-05 65 views
10

顯示現有ListFragment我有以下問題:如何在DialogFragment

我有一個exisiting ListFragment,但我想這顯示以對話方式。

我的第一種方法是創建一個DialogFragment,其中有ListFragment,但顯然目前不可能將碎片放入碎片中。

擴展DialogFragment而不是ListFragment也是不可能的,因爲大量使用ListFragment方法。

有沒有簡單的方法來做到這一點?

+0

我也有類似的問題。我很驚訝,我無法在任何地方找到答案。我認爲這是一個常見的任務,例如當您想要使用縱向片段顯示全屏活動時,以及橫向顯示與對話框相同的片段。 – 2013-01-11 00:53:24

+0

我最終顯示了在框架佈局中覆蓋Main-Fragment的現有ListFragment。我看起來相當不錯在我看來,有點像這樣:http://1.bp.blogspot.com/-f_1A98GQ1fU/T0bzdWnYIOI/AAAAAAAAUmA/MuRnT7-YU28/s1600/export_06.png – knaecke 2013-01-14 22:55:37

+0

也許這個例如:http:// stackoverflow.com/questions/12516626/listfragment-as-dialogfragment/16430898#16430898 – Hpsaturn 2013-05-08 00:48:56

回答

10

什麼工作對我來說是

1)在你的DialogFragment的xml佈局中調用,比方說,DialogFragmentwWithListFragment指定ListFragment類
E.g. 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)DialogFragmentwWithListFragment膨脹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)調用DialogFragmentwWithListFragment作爲常規DialogFragment:

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


希望,它幫助。

+0

謝謝,但如果你需要'setArguments(什麼)'創建'DialogFragmentwWithListFragment'時? – 2016-06-08 18:11:16

3

我會將ListView放在DialogFragment之內,或者嘗試將ListFragment放在Dialog之內。我不確定第二個是否可能。

+0

這打擊了,如果我運行它兩次:「產生的原因:java.lang.IllegalArgumentException異常:二進制XML文件6號線:複製ID 0x7f09007b,標籤空,另一個片段」 – kenyee 2014-09-29 02:01:21

3

你可以通過一個DialogFragment顯示的列表是這樣的:(使用支持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(); 
    } 

} 

在主活動您擴展FragmentActivity和實現接口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

最小的實現和其他固定或父ID爲0xffffffff:http://stackoverflow.com/questions/12516626/listfragment-as-dialogfragment/16430898#16430898 – Hpsaturn 2013-05-08 00:47:53

0

當添加另一個片段中的片段,該文件說,你應該動態地(這樣做即,不是硬編碼一個<fragment>代碼到你的佈局XML。

因此,這裏是如何動態地做到這一點。在這種情況下, ,我加MyListFragmentMyDialogFragment

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

    } 

} 

(正如你將看到,它也包含一些功能設置對話框的標題。)

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> 

這樣做的另一個好處這種方式是,你可以創建一個內部片段的實例,以便將任何參數傳遞給它。

爲了完整起見,這裏是我在活動中使用,以顯示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(); 

}