안드로이드, DialogFragment 요 녀석을 아는감? |
Activity 의 onCreateDialog 등이 deprecated 된 이유를 찾아보다가 DialogFragment 라는 녀석을 알게 되었다.
API 8 부터는 Fragment 의 등장으로, dialog 를 DialogFragment 로 대체"시키"려는 움직임이 강한듯 한다.
DialogFragment 를 사용해서, dialog 의 생명주기를 dialog 자체에 함수콜을 하는 형태가 아니라,
system 에 어느 정도 맡기고 우회해서 call 하는 형태가 추천된다.
참조 : http://developer.android.com/reference/android/app/DialogFragment.html
기본적인 Dialog 생성
public static class MyDialogFragment extends DialogFragment {
int mNum;
static MyDialogFragment newInstance(int num) {
MyDialogFragment f = new MyDialogFragment();
Bundle args = new Bundle();
args.putInt("num", num);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNum = getArguments().getInt("num");
int style = DialogFragment.STYLE_NORMAL, theme = 0;
switch ((mNum-1)%6) {
case 1: style = DialogFragment.STYLE_NO_TITLE; break;
case 2: style = DialogFragment.STYLE_NO_FRAME; break;
case 3: style = DialogFragment.STYLE_NO_INPUT; break;
case 4: style = DialogFragment.STYLE_NORMAL; break;
case 5: style = DialogFragment.STYLE_NORMAL; break;
case 6: style = DialogFragment.STYLE_NO_TITLE; break;
case 7: style = DialogFragment.STYLE_NO_FRAME; break;
case 8: style = DialogFragment.STYLE_NORMAL; break;
}
switch ((mNum-1)%6) {
case 4: theme = android.R.style.Theme_Holo; break;
case 5: theme = android.R.style.Theme_Holo_Light_Dialog; break;
case 6: theme = android.R.style.Theme_Holo_Light; break;
case 7: theme = android.R.style.Theme_Holo_Light_Panel; break;
case 8: theme = android.R.style.Theme_Holo_Light; break;
}
setStyle(style, theme);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_dialog, container, false);
View tv = v.findViewById(R.id.text);
((TextView)tv).setText("Dialog #" + mNum + ": using style " + getNameForNum(mNum));
Button button = (Button)v.findViewById(R.id.show);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
((FragmentDialog)getActivity()).showDialog();
}
});
return v;
}
}
Activity 의 showDialog() 는 다음과 같은 형태가 될 수 있다.
void showDialog() {
mStackLevel++;
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
DialogFragment newFragment = MyDialogFragment.newInstance(mStackLevel);
newFragment.show(ft, "dialog");
}
DialogFragment 를 이용한 AlertDialog
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!");
}
Fragment의 Dlalog 와 Embedding 중 선택 사용하기.
DialogFragment 도 일반 fragment 처럼 사용해도 된다.
이 때 DialogFragment.setShowDialog( boolean showsDialog ) 로 일반 Fragment 로 사용할지, Dialog 로 사용할지 구분시킬 수 있는데, FragmentTransaction.add( int, Fragment ) 가 호출되면 자동으로 setShowDialog( false ) 가 호출된다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] Service 함수 onStartCommand return 값의 의미. (0) | 2013.07.25 |
---|---|
[android] framework FAQ (0) | 2013.07.24 |
[android] FragmentPagerAdapter 사용방법 (0) | 2013.07.23 |
[android] intranet 비슷한 환경 구축하기. (0) | 2013.07.23 |
[android] Webview font에 대한 실험결과 (0) | 2013.07.20 |
댓글