DialogFragment: использование AlertDialog с настраиваемой компоновкой

Я переписываю свое приложение с поддержкой Fragments API . В исходном приложении у меня есть AlertDialog который создается следующим образом:

  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? Я прочитал документацию, но мне трудно понять, как это сделать.

Solutions Collecting From Web of "DialogFragment: использование AlertDialog с настраиваемой компоновкой"

Я удивлен, что никто не ответил. Это решение:

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

Вы можете открыть диалоговое окно, используя:

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

В основном вы можете просто показать свой фрагмент следующим образом:

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