본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] DialogFragment 요 녀석을 아는감?

by 돼지왕왕돼지 2013. 7. 24.


 안드로이드, DialogFragment 요 녀석을 아는감?

 

[android] 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 ) 가 호출된다.







댓글0