프로그래밍/안드로이드

안드로이드 - DialogFragment 로 대화상자 만들기

가카리 2015. 10. 11. 17:12
반응형

 

DialogFragment 클래스는 대화상자를 표현하며 액티비티 위에 대화상자를 표시한다.

프래그먼트 내부의 대화상자는 다음 2가지 방법으로 정의한다.

 

- onCreateView에서 대화상자의 레이아웃을 생성 또는 전개하여 루트 뷰를 리턴한다. 이 루트 뷰에 포함된 위젯이 대화상자에 나타난다.

커스텀 레이아웃을 자유롭게 배치할 수 있다.

- onCreateDialog에서 Dialog나 그 서브 클래스의 객체를 리턴한다. 통상 AlertDialog 객체를 생성하여 리턴하며 기존의 대화상자를 그대로 흉내 낼 수 있다.

 

프래그먼트에 포함된 대화상자는 대화상자 관련 메소드 대신 프래그먼트의 메소드로 관리한다.

 

    int show(FragmentTransaction transaction, String tag)

    void show(FragmentManager manager, String tag)

 

첫 번째 인수로 트랜잭션을 전달하면 프래그먼트를 트랜잭션에 추가하고 commit까지 자동으로 수행하며 대화상자가 즉시 나타난다.

두 번째 인수는 차후의 검색을 위한 태그이다.

 

DialogFragmentTest.java

 

package com.example.ch20_dialogfragment;

 

import android.app.Activity;

import android.app.Dialog;

import android.app.DialogFragment;

import android.app.Fragment;

import android.app.FragmentManager;    

import android.app.FragmentTransaction;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

 

public class DialogFragmentTest extends Activity {

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.dialogfragmenttest);

    }

 

    public void mOnClick(View v){

        FragmentManager fm = getFragmentManager();

        FragmentTransaction tr = fm.beginTransaction();

        Fragment prev = fm.findFragmentByTag("dialog");

        

        if(prev != null){

            tr.remove(prev);

        }

        

        NameGenderFragment dialog = new NameGenderFragment();

        dialog.show(tr, "dialog");

        //dialog.show(fm, "dialog");

    }

 

    public static class NameGenderFragment extends DialogFragment{

        //레이아웃을 전개해서 리턴

        /*public View onCreateView(LayoutInflater inflater, ViewGroup container,

                Bundle savedInstanceState){

            View root = inflater.inflate(R.layout.namegenderfragment, container, false);

            return root;

        }*/

        

        //Dialog 객체 생성해서 리턴

        public Dialog onCreateDialog(Bundle savedInstanceState){

            Dialog dialog = new Dialog(getActivity());

            dialog.setContentView(R.layout.namegenderfragment);

            

            return dialog;

        }

    }

}

 

 

dialogfragmentttest.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

    <Button

     android:id="@+id/btn"

     android:layout_width="wrap_content"

     android:layout_height="wrap_content"

     android:onClick="mOnClick"

     android:text="대화상자 호출"

     />

</LinearLayout>

 

namegenderfragment.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center_horizontal"

>

<LinearLayout

android:layout_width="match_parent"

android:layout_height="wrap_content"

>

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="이름"

/>

<EditText

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="김아무개"

/>

</LinearLayout>

<RadioGroup

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:checkedButton="@+id/man"

>

<RadioButton

android:id="@id/man"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="남자"

/>

<RadioButton

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="여자"

/>

</RadioGroup>

 

 

</LinearLayout>

 

 

 

 

실행화면