2012-07-05 10 views
10

में एक मौजूदा ListFragment प्रदर्शित करने के लिए मैं निम्नलिखित समस्या है:कैसे एक DialogFragment

मैं किसी वर्तमान है ListFragment, लेकिन मैं एक संवाद के रूप में इस प्रदर्शित करना चाहते हैं।

मेरा पहला दृष्टिकोण DialogFragment बनाना था जो इसके अंदर ListFragment है, लेकिन जाहिर है कि टुकड़ों में टुकड़े रखना संभव नहीं है।

ListFragment के बजाय ListFragment के DialogFragment को ListFragment विधियों के भारी उपयोग के कारण भी संभव नहीं है।

क्या ऐसा करने का कोई आसान तरीका है?

+0

मैं भी इसी तरह की समस्या है:

पूर्णता के लिए, यहाँ कोड है कि मैं अपने गतिविधि में उपयोग DialogFragment को दिखाने के लिए है। और मुझे आश्चर्य है कि मुझे कहीं भी जवाब नहीं मिल रहा है। मुझे लगता है कि यह एक आम काम है, उदा। जब आप पोर्ट्रेट में फ्रैगमेंट के साथ पूर्ण स्क्रीन गतिविधि प्रदर्शित करना चाहते हैं, और वही टुकड़ा परिदृश्य में संवाद के रूप में प्रदर्शित करना चाहते हैं। –

+0

मैंने फ़्रेम-लेआउट में मुख्य-टुकड़े को ओवरलेइंग करने वाले मौजूदा सूचीफ्रेम को मरने का प्रदर्शन समाप्त कर दिया। मैं अपनी राय में काफी अच्छा लग रहा हूं, इस तरह थोड़ा: http://1.bp.blogspot.com/-f_1A98GQ1fU/T0bzdWnYIOI/AAAAAAAAUmA/MuRnT7-YU28/s1600/export_06.png – knaecke

+0

शायद यह उदाहरण: http: // stackoverflow.com/questions/12516626/listfragment-as-dialogfragment/16430898#16430898 – Hpsaturn

उत्तर

10

क्या काम करता है को लागू करता है मेरे लिए

1) आपके डायलॉग फ्रैगमेंट के लिए एक्सएमएल लेआउट में कहा गया है, मान लें, DialogFragmentwWithListFragment ListFragment class
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> 
DialogFragmentwWithListFragment में

2) बढ़ 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) नियमित DialogFragment रूप DialogFragmentwWithListFragment आह्वान:

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


आशा है, यह मदद करता है।

+0

धन्यवाद, लेकिन अगर आपको 'सेट ऑर्गमेंट्स') ''DialogFragmentwWithListFragment' बनाते समय ?? –

3

मैं या तो ListViewDialogFragment के अंदर रखता हूं या को Dialog के अंदर डालने का प्रयास करता हूं। मुझे यकीन नहीं है कि दूसरा दूसरा संभव है या नहीं।

+0

अगर मैं इसे दो बार चलाता हूं तो यह उड़ाता है: "इसके कारण: java.lang.IllegalArgumentException: बाइनरी एक्सएमएल फ़ाइल लाइन # 6: डुप्लिकेट आईडी 0x7f09007b, टैग शून्य, या पैरेंट आईडी 0xffffffff एक और खंड के साथ " – kenyee

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

न्यूनतम कार्यान्वयन और अन्य ठीक करें: http://stackoverflow.com/questions/12516626/listfragment-as-dialogfragment/16430898#16430898 – Hpsaturn

0

जब एक और टुकड़ा अंदर एक टुकड़ा जोड़ने, प्रलेखन कहते हैं आप यह गतिशील (क्या करना चाहिए यानी, बल्कि अपने लेआउट एक्सएमएल में एक <fragment> टैग हार्डकोड से।

तो यहाँ कैसे गतिशील रूप से यह करने के लिए है। इस मामले में

MyDialogFragment:, मैं MyListFragmentMyDialogFragment में जोड़ें।जावा

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> 

यह कर का एक और लाभ इस तरह से आप किसी भी तर्क को पारित करने के लिए आंतरिक टुकड़े का एक उदाहरण बना सकते हैं।

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

} 
संबंधित मुद्दे