2012-05-14 2 views
22

Fragments API 지원으로 애플리케이션을 다시 작성하고 있습니다. 원래 응용 프로그램에서 나는 다음과 같이 생성되는 AlertDialog 있습니다DialogFragment : 맞춤 레이아웃으로 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를 통해 같은 대화 상자를 표시 할 수 있습니까? 나는이 문서를 읽었지만 이것을 계속하는 방법을 알아 내는데 어려움을 겪고있다.

답변

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

시스템 서비스를 호출하고 캐스팅하는 대신 getActivity(). 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())); 
} 
} 
관련 문제