[안드로이드] 하나의 DialogFragment 객체로 다른 text 보여주는 법

프로그래밍/Android 관련2017. 12. 17. 19:54

안녕하세요. 개발자 드리머즈입니다.


DialogFragment를 상속받는 자신만의 클래스 생성 후 이의 객체를 사용할 때,

하나의 고정된 dialog message만을 표시할 수 있다면 아주 불편할 것입니다.

실제로 앱을 개발하다보면,

DialogFragment의 style은 유지하면서 표시하는 dialog message만을 변경하여 보고 싶은 경우가 많습니다.


그래서 어떻게 하면 dialog message를 변경할 수 있는지 찾아봤습니다.



방법은 Fragment로부터 상속받는 setArguments(), getArguments()함수를 사용하는 것입니다.

이 함수를 사용하여 Bundle을 주고 받을 수 있습니다.

Bundle의 객체는 map처럼 key,value 쌍으로 여러 데이터를 담을 수 있으므로 유용합니다.



*MyCustomDialogFragment 클래스

public class MyCustomDialogFragment extends DialogFragment {

public static final String DIALOG_MESSAGE = "dialogMessage";
String dialogMessage = "not set";

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

Bundle bundle = getArguments();
if (bundle != null) {
dialogMessage = bundle.getString(DIALOG_MESSAGE);
}

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), android.R.style.Theme_DeviceDefault_Light_Dialog_Alert);

builder.setMessage(dialogMessage)
.setPositiveButton("Positive", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {

}
})
.setNegativeButton("Negative", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {

}
});


return builder.create();
}
}


*원하는 Activity에서 호출할 때 코드

MyCustomDialogFragment mcdf = new MyCustomDialogFragment();

Bundle args = new Bundle();
args.putString(DIALOG_MESSAGE, "My Custom Message");
mcdf.setArguments(args);

mcdf.show(getFragmentManager(), "TestDialog");



안드로이드 디벨로퍼 사이트에서는 아래와 같이 title을 설정하는 예제가 있습니다.

setArguments()와 getArguments()를 주목해서 보면 되겠습니다.


*DialogFragment를 상속받는 클래스

public static class MyAlertDialogFragment extends DialogFragment {

   
public static MyAlertDialogFragment newInstance(int title) {
       
MyAlertDialogFragment frag = new MyAlertDialogFragment();
       
Bundle args = new Bundle();
        args
.putInt("title", title);
        frag
.setArguments(args);
       
return frag;
   
}

   
@Override
   
public Dialog onCreateDialog(Bundle savedInstanceState) {
       
int title = getArguments().getInt("title");

       
return new AlertDialog.Builder(getActivity())
               
.setIcon(R.drawable.alert_dialog_icon)
               
.setTitle(title)
               
.setPositiveButton(R.string.alert_dialog_ok,
                   
new DialogInterface.OnClickListener() {
                       
public void onClick(DialogInterface dialog, int whichButton) {
                           
((FragmentAlertDialog)getActivity()).doPositiveClick();
                       
}
                   
}
               
)
               
.setNegativeButton(R.string.alert_dialog_cancel,
                   
new DialogInterface.OnClickListener() {
                       
public void onClick(DialogInterface dialog, int whichButton) {
                           
((FragmentAlertDialog)getActivity()).doNegativeClick();
                       
}
                   
}
               
)
               
.create();
   
}
}


*Activity쪽 코드

void showDialog() {
   
DialogFragment newFragment = MyAlertDialogFragment.newInstance(
            R
.string.alert_dialog_two_buttons_title);
    newFragment
.show(getFragmentManager(), "dialog");
}

public void doPositiveClick() {
   
// Do stuff here.
   
Log.i("FragmentAlertDialog", "Positive click!");
}

public void doNegativeClick() {
   
// Do stuff here.
   
Log.i("FragmentAlertDialog", "Negative click!");
}



*참고

안드로이드 디벨로퍼 FragmentDialog : https://developer.android.com/reference/android/app/DialogFragment.html

스택오버플로우 질문글 : https://stackoverflow.com/questions/26637213/while-passing-android-dialogfragment-arguments-oncreatedialog-bundle-agument-is


작성자

Posted by 드리머즈

관련 글

댓글 영역