2012-05-14 12 views
22

मैं Fragments API समर्थन के साथ अपने आवेदन को फिर से लिखने रहा हूँ के साथ AlertDialog का उपयोग करना। मूल आवेदन में मैं एक AlertDialog है कि इस तरह बनाई गई है है:DialogFragment: कस्टम लेआउट

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.button_dialog, null); 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setView(view); 
    ListView mListView = (ListView) view.findViewById(R.id.mblist); 
    builder.setTitle(getString(R.string.sysinfo)).setNeutralButton(
      getString(R.string.okay), null); 
    Cursor dcursor = propManager.propCursor(); 
    if (dcursor.moveToFirst()) { 
     startManagingCursor(dcursor); 
     String[] from = { Constants.NAME_DET, 
       Constants.VALUE_DET }; 
     int[] to = { R.id.mbname, R.id.mbvalue }; 
     SimpleCursorAdapter dadapter = new SimpleCursorAdapter(this, 
       R.layout.info_list_row, dcursor, from, to); 
     mListView.setAdapter(dadapter); 
    } 
    final Dialog dialog = builder.create(); 
    dialog.show(); 

कैसे मैं एक DialogFragment के माध्यम से एक ही संवाद प्रदर्शित कर सकते हैं? मैंने प्रलेखन पढ़ा है लेकिन इस बात को समझने में परेशानी है कि इसके साथ कैसे आगे बढ़ना है।

उत्तर

43

मुझे आश्चर्य है कि किसी ने भी जवाब नहीं दिया।

private void showDialog() { 
    // DialogFragment.show() will take care of adding the fragment 
    // in a transaction. We also want to remove any currently showing 
    // dialog, so make our own transaction and take care of that here. 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog"); 
    if (prev != null) { 
     ft.remove(prev); 
    } 
    ft.addToBackStack(null); 

    // Create and show the dialog. 
    DialogFragment newFragment = PropDialogFragment.newInstance(); 
    newFragment.show(ft, "dialog"); 
} 
+0

यह एक बहुत मदद की। धन्यवाद। – BruceHill

+1

क्या आप सिस्टम सेवा और कास्टिंग को कॉल करने के बजाय 'एक्टिविटी()। GetLayoutInflater() 'प्राप्त करेंगे? –

+0

बहुत बढ़िया जवाब। बस किसी के उत्सुक होने पर, [दस्तावेज़ इसमें शामिल हैं] (https://developer.android.com/reference/android/app/DialogFragment.html)। – Project

1

मूल रूप से आप सिर्फ इस तरह अपने टुकड़ा दिखा सकते हैं:

public class PropDialogFragment extends DialogFragment { 

    private PropDialogFragment() { /*empty*/ } 

    /** creates a new instance of PropDialogFragment */ 
    public static PropDialogFragment newInstance() { 
     return new PropDialogFragment(); 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     //getting proper access to LayoutInflater is the trick. getLayoutInflater is a     //Function 
     LayoutInflater inflater = getActivity().getLayoutInflater(); 

     View view = inflater.inflate(R.layout.my_dialog, null); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setView(view); 
     builder.setTitle(getActivity().getString(R.string.sysinfo)).setNeutralButton(
       getActivity().getString(R.string.okay), null); 
     return builder.create(); 
    } 
} 

आप का उपयोग संवाद दिखा सकते हैं: यह समाधान है

SherlockDialogFragment newFragment = new TimePickerFragment(); 
newFragment.show(getActivity().getSupportFragmentManager(), "timePicker"); 

और यह एक सरल TimePickerFragment होगा :

public class TimePickerFragment extends SherlockDialogFragment implements TimePickerDialog.OnTimeSetListener{ 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     final Calendar c = Calendar.getInstance(); 
     int hour = c.get(Calendar.HOUR_OF_DAY); 
     int minute = c.get(Calendar.MINUTE); 


     return new TimePickerDialog(getActivity(), this, hour, minute, DateFormat.is24HourFormat(getActivity())); 
} 
} 
संबंधित मुद्दे