본문 바로가기
코딩일기/android studio

안드로이드 독학 18일차 : 커스텀 대화상자(Custom Dialog)

by 욱파이어니어 2021. 4. 8.
728x90
반응형

이제 만들어 볼 것은 커스텀 대화 상자이다.

 

커스텀 대화 상자를 만들려면 두 가지의 layout이 존재해야 한다.

1. 메인 layout

2. 대화 상자 내의 layout

 

그럼 xml 소스부터 보자.

 

메인 Layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/goLogin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="로그인"
        android:textSize="25dp"
        android:layout_gravity="center"/>
</LinearLayout>

커스텀 Dialog Layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="300dp"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="아이디"/>
    <EditText
        android:id="@+id/id_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="아이디를 입력하세요 : " />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="비밀번호" />
    <EditText
        android:id="@+id/pw_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="비밀번호를 입력하세요 : "
        android:inputType="textPassword"/>
    <Button
        android:id="@+id/login_bt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="로그인"/>
</LinearLayout>

여기서 중요한 점은 Layout을 감싸는 부부의 witdh는 match_parent 혹은 wrap_content로 하게 되면 모양이 이상해지니

직접 숫자를 넣어줘야 한다. 그리고 height도 지금은 wrap_content로 하긴 했지만 이게 나중 가면 기기마다 크기가 

달라지기 때문에 나중에는 기기마다 크기 값을 설정해주는 함수를 만들어서 설정해줘야 한다.

 

화면은 이러하다.

 

메인 화면

Dialog 화면

 

무튼이제 자바 소스로 넘어가자

 

자바 소스는 내가 주석으로 설명해놨으니 참고하면 될 것 같다.

public class MainActivity extends AppCompatActivity implements Button.OnClickListener{
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button bt1 = (Button)findViewById(R.id.goLogin);
        //Activity에서 Button.OnClickListener를 상속 받앗기때문에 this 사용
        bt1.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        //Dialog도 매개변수로 context 받기 때문에 this가 가능함
        final Dialog login = new Dialog(this);

        //커스텀 Dialog의 화면을 아래 layout으로 설정
        login.setContentView(R.layout.login);

        //Dialog 타이틀 설정
        login.setTitle("로그인");
        login.show();

        //login layout에서 버튼값 가져오기
        Button loginBt = login.findViewById(R.id.login_bt);
        //login layout에 있는 editText 값 가져오기 위해서 final 설정
        final EditText id = login.findViewById(R.id.id_container);
        final EditText pwd = login.findViewById(R.id.pw_container);

        //로그인 버튼 클릭했을때 진입
        loginBt.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View view) {
                //id 와 pwd가 모두 무언갈 입력했을때
                if(id.getText().length()>0 && pwd.getText().length()>0){
                    Toast.makeText(getApplicationContext(),"로그인 성공",Toast.LENGTH_SHORT).show();
                    //Dialog 없앰
                    login.dismiss();

                    //키보드 없앰
                    InputMethodManager immhide = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
                    immhide.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

                }else if(id.getText().length()<=0 ){ //id가 비어 있을때
                    Toast.makeText(getApplicationContext(),"id를 입력하지 않았습니다",Toast.LENGTH_SHORT).show();
                    //id 부분에 focus
                    id.requestFocus();
                    //키보든 보이게 하는 부분
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
                }else if(pwd.getText().length()<=0 ){ //pwd가 비어 있을때
                    Toast.makeText(getApplicationContext(),"비밀번호를 입력하지 않았습니다",Toast.LENGTH_SHORT).show();
                    pwd.requestFocus();
                    //키보든 보이게 하는 부분
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
                }
            }
        });
    }
}
반응형