Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DialogFragment : Using AlertDialog with custom layout

Tags:

I'm rewriting my application with Fragments API support. In the original application I have an AlertDialog that is created like this :

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

How can I display the same dialog via a DialogFragment? I have read the documentation but have trouble figuring out how to proceed with this.

like image 572
Binoy Babu Avatar asked May 14 '12 08:05

Binoy Babu


2 Answers

I'm surprised that nobody answered. This is the solution:

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

You can show the dialog using :

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"); } 
like image 187
Binoy Babu Avatar answered Sep 23 '22 11:09

Binoy Babu


Basically you can just show your Fragment like this:

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

And this would be a simple 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())); } } 
like image 40
user2162545 Avatar answered Sep 25 '22 11:09

user2162545