2012-07-05 31 views
10

Tôi có vấn đề sau đây:Làm thế nào để hiển thị một ListFragment tồn tại trong một DialogFragment

Tôi đã một exisiting ListFragment, nhưng tôi muốn hiển thị này như một hộp thoại.

Cách tiếp cận đầu tiên của tôi là tạo ra một DialogFragment trong đó có ListFragment bên trong nó, nhưng dường như hiện tại không thể đưa mảnh vỡ thành từng mảnh.

Mở rộng DialogFragment thay vì ListFragment cũng không thể thực hiện được do sử dụng nhiều phương pháp ListFragment.

Có cách nào dễ dàng để thực hiện việc này không?

+0

Tôi cũng có vấn đề tương tự. Và tôi ngạc nhiên là tôi không thể tìm thấy câu trả lời ở bất cứ đâu. Tôi nghĩ đó là một nhiệm vụ phổ biến, ví dụ: khi bạn muốn hiển thị toàn bộ hoạt động trên màn hình với Phân đoạn theo chiều dọc và cùng một hộp thoại Phân đoạn dưới dạng ngang. –

+0

Tôi đã kết thúc hiển thị die ListFragment hiện có chồng lên Main-Fragment trong một Frame-Layout. Tôi trông khá đẹp trong quan điểm của tôi, một chút như thế này: http://1.bp.blogspot.com/-f_1A98GQ1fU/T0bzdWnYIOI/AAAAAAAAUmA/MuRnT7-YU28/s1600/export_06.png – knaecke

+0

Có lẽ ví dụ này: http: // stackoverflow.com/questions/12516626/listfragment-as-dialogfragment/16430898#16430898 – Hpsaturn

Trả lời

10

làm việc gì cho tôi là

1) trong bố cục xml cho DialogFragment của bạn, giả sử, DialogFragmentwWithListFragment chỉ định lớp ListFragment
Ví dụ: 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) trong DialogFragmentwWithListFragment thổi phồng 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) gọi DialogFragmentwWithListFragment như DialogFragment thường xuyên:

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


Hy vọng sẽ giúp ích.

+0

Cảm ơn, nhưng nếu bạn cần' setArguments () 'khi tạo' DialogFragmentwWithListFragment' ?? –

3

Tôi sẽ đặt ListView bên trong DialogFragment hoặc cố gắng đặt ListFragment bên trong một Dialog. Tôi không chắc chắn nếu điều thứ hai là có thể mặc dù.

+0

điều này thổi lên nếu tôi chạy nó hai lần với: "Gây ra bởi: java.lang.IllegalArgumentException: dòng nhị phân XML dòng # 6: Duplicate id 0x7f09007b, tag null, hoặc id mẹ 0xffffffff với một đoạn khác " – kenyee

3

Bạn có thể hiển thị một danh sách thông qua một DialogFragment theo cách này: (sử dụng thư viện hỗ trợ 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(); 
    } 

} 

Trên hoạt động chính bạn mở rộng FragmentActivity và thực hiện các giao diện 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

Thực hiện tối thiểu và một số khác sửa lỗi: http://stackoverflow.com/questions/12516626/listfragment-as-dialogfragment/16430898#16430898 – Hpsaturn

0

Khi thêm một đoạn trong đoạn khác, các tài liệu nói rằng bạn nên làm điều đó tự động (ví dụ, thay vì hardcoding một thẻ <fragment> vào layout XML của bạn.

Vì vậy, đây là làm thế nào để làm điều đó tự động. Trong trường hợp này , Tôi thêm MyListFragment vào 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(); 

    } 

} 

(Như bạn sẽ thấy, nó cũng chứa một số chức năng để thiết lập các tiêu đề của hộp thoại.)

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> 

Một ưu điểm khác làm việc đó theo cách này là bạn có thể tạo một thể hiện của đoạn bên trong để truyền bất kỳ đối số nào cho nó.

Để hoàn chỉnh, đây là mã mà tôi sử dụng trong hoạt động của tôi để hiển thị các 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(); 

} 
Các vấn đề liên quan