Chapter 07 메뉴와 대화상자

Ruinak·2021년 8월 25일
0

Android

목록 보기
8/15
post-thumbnail

1. 메뉴

  • 메뉴는 사용자가 여러 개 중 하나를 선택하도록 하여 사용자의 명령을 받아들이는 간편한 방식으로 일반 PC용 프로그램에서도 널리 사용됩니다.
  • 안드로이드의 메뉴는 옵션 메뉴(option menu)와 컨텍스트 메뉴(context menu)로 구분됩니다.
  • 옵션 메뉴를 사용하는 방법에는 메뉴 XML 파일을 생성한 후 Java에서 호출하는 방법과 XMl 파일 없이 Java 코드만으로 메뉴를 생성하는 방법이 있습니다.
  • 메뉴는 항목이 대부분 고정되어 있으므로 메뉴 XML 파일을 이용합니다.
  • 메뉴 XMl 파일을 이용하면 앱을 다른 나라 언어로 변경할 때 Java 코드를 건드리지 않아도 되므로 효율적입니다.

7-1 XML을 이용한 옵션 메뉴

  • 메뉴 XML 파일을 이용하는 방식은 아래의 세 가지만 설정하면 됩니다.
  • 메뉴 XML 파일의 형식은 아래와 같습니다.
<menu>
	<item
    	android:id="@+id/항목1아이디"
        android:title="항목1 제목" />
    <item
    	android:id="@+id/항목2아이디"
        android:title="항목2 제목" />
 </menu>
  • 위의 예에서는 항목(item)이 2개입니다.
  • 메뉴에는 '항목1 제목, '항목2 제목'이 출력됩니다.
  • 메뉴 안에서 서브 메뉴도 생성할 수 있습니다.
  • Activty 클래스에서 오버라이딩하는 onCreateOptionsMenu( ) 메서드는 앱이 실행되면 메뉴의 내용을 XML 파일에서 자동으로 읽어옵니다.
  • 메서드에 코딩할 내용을 아래와 같이 거의 고정되어 있으므로 그대로 사용하면 됩니다.
public boolean onCreateOptionsMenu(Menu menu){
	super.onCreateOptionsMenu(menu);
	MenuInflater mInflater = getMenuInflater();
	mInflater.inflate(R.menu.메뉴XML아이디, menu);
	return true;
}
  • Activity 클래스에서 오버라이딩하는 onOptionsItemSelected( ) 메서드는 메뉴를 선택했을 때 어떤 동작을 할 것인지를 담고 있습니다.
  • 메뉴는 항목이 여러 개 나오기 때문에 보통 메서드 내부에서 switch( ) ~ case문을 사용합니다.
public boolean onOptionsItemSelected(MenuItem item){
	switch (item.getItemId()) {
   		case R.id.항목1 아이디 :
   			항목1을 선택했을 때 실행할 코드
 			return true;
		case R.id.항목2 아이디 :
			항목2을 선택했을 때 실행할 코드
			return true;
	}
	return false;
}
  • 위 코드에서 case문의 '항목1아이디, '항목2아이디'를 메뉴 XML 파일의 해당 아이디로 바꾸면 됩니다.

인플레이터(Inflater)

  • 인플레이터는 '부풀리는 장치' 또는 '자전거 등의 공기 펌프'라는 뜻입니다.
  • 풍선에 바람을 넣어서 실제 객체로 만들어 사용한다는 의미입니다.
    - 풍선은 바람을 넣기 전에는 별 의미가 없습니다.
  • 안드로이드에서 사용되는 인플레이터를 이에 비유하면, 정적으로 존재하는 XML파일(풍선)을 Java 코드에서 접근하여(바람을 넣어) 실제 객체로 만들어 사용하는 것이라고 볼 수 있습니다.
  • 메뉴 인플레이터(MenuInflater) 객체는 메뉴 XML 파일을 Java 코드에서 가져와 사용하는 것이고, 레이아웃 인플레이터(LayoutInflater) 객체는 레이아웃 XML 파일을 Java 코드에서 가져와 사용하는 것입니다.

실습 7-1 배경색 바꾸기 앱 만들기

예제 7-1 activity_main.xml

<androidx.appcompat.widget.LinearLayoutCompat 
    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"
    android:id="@+id/baseLayout"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="오른쪽 위 메뉴 버튼을 누르세요" 
        android:textSize="26dp"
        android:layout_gravity="center"/>
    <androidx.appcompat.widget.AppCompatButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="이건 버튼"
        android:textSize="22dp"
        android:background="@android:color/holo_blue_bright"
        android:layout_gravity="center" />

</androidx.appcompat.widget.LinearLayoutCompat>

예제 7-2 menu1.xml

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

    <item
        android:id="@+id/itemRed"
        android:title="배경색(빨강)">
    </item>
    <item
        android:id="@+id/itemGreen"
        android:title="배경색(초록)">
    </item>
    <item
        android:id="@+id/itemBlue"
        android:title="배경색(파랑)">
    </item>

    <item
        android:title="버튼 변경 >> ">
        <menu>
            <item
                android:id="@+id/subRotateR"
                android:title="버튼 45도 회전" />
            <item
                android:id="@+id/subSizeUp"
                android:title="버튼 2배 확대" />
            <item
                android:id="@+id/subOriginal"
                android:title="버튼 원상복구" />
        </menu>
    </item>

</menu>

예제 7-3, 4, 5 MainActivity 코드

public class MainActivity extends AppCompatActivity {
    private LinearLayoutCompat baseLayout;
    private Button btn1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("배경색 바꾸기");

        init();
    }
    public void init(){
        baseLayout = findViewById(R.id.baseLayout);
        btn1 = findViewById(R.id.btn1);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        MenuInflater mInflater = getMenuInflater();
        mInflater.inflate(R.menu.menu1, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.itemRed: 
                baseLayout.setBackgroundColor(Color.RED);
                return true;
            case R.id.itemGreen:
                baseLayout.setBackgroundColor(Color.GREEN);
                return true;
            case R.id.itemBlue:
                baseLayout.setBackgroundColor(Color.BLUE);
                return true;
            case R.id.subRotateR:
                btn1.setRotation(45);
                return true;
            case R.id.subSizeUp:
                btn1.setScaleX(2);
                return true;
            case R.id.subOriginal:
                btn1.setRotation(0);
                btn1.setScaleX(1);
                return true;
        }
        return false;
    }
}

2. Java 코드만 이용한 옵션 메뉴

  • 옵션 메뉴를 사용할 때 메뉴 XML 파일 없이 Java 코드만으로도 생성할 수 있습니다.
  • onCreateOptionsMenu( ) 메서드 안에서 메뉴 XML 파일에 접근하는 대신에 직접 menu.add( ) 메서드로 메뉴 항목을 추가하는 것입니다.

예제 7-6 Java 코드만으로 구성한 옵션 메뉴

public class MainActivity extends AppCompatActivity {
    private LinearLayoutCompat baseLayout;
    private Button btn1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("배경색 바꾸기");

        init();
    }
    public void init(){
        baseLayout = findViewById(R.id.baseLayout);
        btn1 = findViewById(R.id.btn1);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        menu.add(0, 1, 0, "배경색(빨강)");
        menu.add(0, 2, 0, "배경색(초록)");
        menu.add(0, 3, 0, "배경색(파랑)");

        SubMenu sMenu = menu.addSubMenu("버튼 변경 >> ");
        sMenu.add(0, 4, 0, "버튼 45도 회전");
        sMenu.add(0, 5, 0, "버튼 2배 확대");
        sMenu.add(0, 6, 0, "버튼 원상복구");

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case 1 :
                baseLayout.setBackgroundColor(Color.RED);
                return true;
            case 2 :
                baseLayout.setBackgroundColor(Color.GREEN);
                return true;
            case 3 :
                baseLayout.setBackgroundColor(Color.BLUE);
                return true;
            case 4 :
                btn1.setRotation(45);
                return true;
            case 5 :
                btn1.setScaleX(2);
                return true;
            case 6 :
                btn1.setRotation(0);
                btn1.setScaleX(1);
                return true;
        }
        return false;
    }
}

3. XML을 이용한 컨텍스트 메뉴

  • 위에서 배운 옵션 메뉴는 키패드의 메뉴 버튼을 클릭할 때 나타났습니다.
  • 이와 달리 컨텍스트 메뉴는 레이아웃 또는 버튼, 에디트 텍스트 틍의 위젯을 롱클릭했을 때 화면 중앙에 나타나며 Windows의 팝업 창과 비슷합니다.
  • 컨텍스트 메뉴에서 메뉴 XML 파일을 이용하는 방식은 옵션 메뉴와 비슷합니다.
  • 여러 개의 위젯에 메뉴를 설정할 수 있으므로 onCreate( ) 메서드에서 컨텍스트 메뉴를 나타낼 위젯을 registerForContextMenu( )로 등록해야 합니다.
  • 메뉴 XML 파일은 컨텍스트 메뉴가 나오게 할 위젯마다 별도의 파일로 만들어야 합니다.
  • 메뉴 XML의 문법은 옵션 메뉴와 동일합니다.
  • onCreateContextMenu( ) 메서드에는 위젯별로 컨텍스트 메뉴가 나타나야 하므로 위젯별 컨텍스트 메뉴를 if문으로 등록해야 합니다.
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuinfo) {
	super.onCreateContextMenu(menu, v, menuInfo);

	MenuInflater mInflater = getMenuInflater();
	if(v == 위젯 1) {
		mInflater.inflate(R.menu.첫번째메뉴XML파일, menu);
	}
	if(v == 위젯 2) {
		mInflater.inflate(R.menu.두번째메뉴XML파일, menu);
	}
}
  • onContextItemSelected( ) 메서드의 내용은 옵션 메뉴의 onOptionsItemSelected( )와 동일하게 작성합니다.

실습 7-2 배경색 변경 및 버튼 변경 앱 만들기

예제 7-7 activity_main.xml

<androidx.appcompat.widget.LinearLayoutCompat
    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"
    android:id="@+id/baseLayout"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btnBackgroundChange"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="배경색 변경"
        android:layout_gravity="center" />
    <Button
        android:id="@+id/btnButtonChange"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="버튼 변경"
        android:layout_gravity="center" />

</androidx.appcompat.widget.LinearLayoutCompat>

예제 7-8 menu1.xml

<menu
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menuRed"
        android:title="배경색(빨강)" />
    <item
        android:id="@+id/menuBlue"
        android:title="배경색(파랑)" />
    <item
        android:id="@+id/menuGreen"
        android:title="배경색(초록)" />
</menu>

예제 7-9 menu2.xml

<menu
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/subRotate"
        android:title="버튼 45도 회전" />
    <item
        android:id="@+id/subSizeUP"
        android:title="버튼 2배 확대" />
</menu>

예제 7-10 Java 코드

public class MainActivity extends AppCompatActivity {

    private LinearLayoutCompat baseLayout;
    private Button btnBackgroundChange, btnButtonChange;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("배경색 바꾸기(컨텍스트 메뉴)");

        init();        
    }
    public void init(){
        baseLayout = (LinearLayoutCompat)findViewById(R.id.baseLayout);
        btnBackgroundChange = findViewById(R.id.btnBackgroundChange);
        registerForContextMenu(btnBackgroundChange);
        btnButtonChange = findViewById(R.id.btnButtonChange);
        registerForContextMenu(btnButtonChange);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
    				ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);

        MenuInflater mInflater = getMenuInflater();
        if(v == btnBackgroundChange){
            menu.setHeaderTitle("배경색 변경");
            mInflater.inflate(R.menu.menu1, menu);
        }
        if(v == btnButtonChange){
            mInflater.inflate(R.menu.menu2, menu);
        }
    }
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.itemRed:
                baseLayout.setBackgroundColor(Color.RED);
                return true;
            case R.id.itemGreen:
                baseLayout.setBackgroundColor(Color.GREEN);
                return true;
            case R.id.itemBlue:
                baseLayout.setBackgroundColor(Color.BLUE);
                return true;
            case R.id.subRotate:
                btnBackgroundChange.setRotation(45);
                return true;
            case R.id.subSizeUp:
                btnButtonChange.setScaleX(2);
                return true;
        }
        return false;
    }
}

2. 토스트

  • 지금까지 여러 번 보았듯이 토스트(toast)는 화면에 잠깐 나타났다 사라지는 메시지입니다.
  • 토스트는 사용자가 인식해야 할 작은 메시지를 보여줄 때 사용하면 편리하며 프로그래머가 디버깅 용도로 사용하기에도 적당합니다.
  • 아래는 토스트의 가장 일반적인 사용 형태입니다.
Toast.makeText(Context context, String message, int duration).show();
  • Context는 현재 화면(액티비티)을 표시하기 위해 this를 주로 사용합니다.
  • 버튼을 클릭했을 때 내부 클래스에서 토스트를 출력하기 위해 예외적으로 '액티비티명.this'를 사용했습니다.
  • duration은 화면에 나타나는 시간인데 Toast.LENGTH_LONG이나 Toast.LENGTH_SHORT 중 하나를 사용합니다.
  • 마지막에는 생성된 토스트를 화면에 보여주기 위해 show( ) 메서드를 사용했습니다.
  • 토스트는 기본적으로 화면의 중앙 하단 부근에 나타내는데, setGravity( ) 메서드를 사용하면 위치를 변경할 수 있습니다.
Toast.setGravity(int gravity, int xOffset, int yOffset);
  • gravity에는 화면의 상단, 중앙, 하단 등을 지정하고 xOffest과 yOffset은 떨어진 거리를 나타냅니다.

예제 7-12 토스트 연습용 activity_main.xml

<androidx.appcompat.widget.LinearLayoutCompat
    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"
    android:layout_margin="20dp"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="메세지 출력" />

</androidx.appcompat.widget.LinearLayoutCompat>

예제 7-13 토스트 연습용 Java 코드

public class MainActivity extends AppCompatActivity{

    private Button btn1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        initLr();
    }

    public void init(){
        btn1 = findViewById(R.id.btn1);
    }
    
    public void initLr(){
        btn1.setOnClickListener(v ->{
            Toast tMsg = Toast.makeText(this, "토스트 연습", Toast.LENGTH_SHORT);

            tMsg.show();
        });
    }
}

3. 대화상자

  • 대화상자(dialog)는 화면에 메세지를 나타낸 후 확인이나 취소 같은 사용자의 선택을 받아들이는 경우에 사용합니다.
  • 토스트보다 좀 더 강력한 메세지를 전할 때 적당합니다.

3-1 기본 대화상자

  • 대화상자는 사용자에게 중요한 사항을 알려 준 후 사용자가 어떤 선택을 하게 하는 것이 주요 목적입니다.
  • 사용자에게 내용을 좀 더 확실히 주지시켜야 할 때 혹은 계속 진행할지 여부를 선택하게 할 때 사용합니다.
  • 대화상자 설정 순서는 아래와 같습니다.
  • 안드로이드에서 대화상자를 생성할 때는 AletDialog.Builder 클래스를 주로 사용하고, 다양한 메서드를 이용하여 대화상자를 꾸밉니다.
  • 최종적으로는 show( ) 메서드로 대화상자를 화면에 출력합니다.

예제 7-14 대화상자 연습용 activity_main.xml

<androidx.appcompat.widget.LinearLayoutCompat
    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"
    android:layout_margin="20dp"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="대화상자" />

</androidx.appcompat.widget.LinearLayoutCompat>

기본적인 대화상자의 Java 코드

public class MainActivity extends AppCompatActivity{

    private Button btn1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        initLr();
    }

    public void init(){
        btn1 = findViewById(R.id.btn1);
    }

    public void initLr(){
        btn1.setOnClickListener(v ->{
            AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
            dlg.setTitle("제목입니다.");
            dlg.setMessage("이곳이 내용입니다.");
            dlg.setIcon(R.mipmap.ic_launcher);
            dlg.show();
        });
    }
}

예제 7-16 버튼 1개인 대화상자의 Java 코드

public class MainActivity extends AppCompatActivity{

    private static final String TAG = "MainActivity2";

    private Button btn1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        initLr();
    }

    public void init(){
        btn1 = findViewById(R.id.btn1);
    }

    public void initLr(){
        btn1.setOnClickListener(v ->{
            AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
            dlg.setTitle("제목입니다.");
            dlg.setMessage("이곳이 내용입니다.");
            dlg.setIcon(R.mipmap.ic_launcher);
            dlg.setPositiveButton("확인", null);
            dlg.show();
        });
    }
}

  • setPositiveButton("문자열", 리스너)의 형태로 현재는 리스너 부분에 null을 입력했으므로 "확인"을 클릭해도 대화상자만 닫힐 뿐 아무 동작도 일어나지 않습니다.
  • 실제로는 "확인"을 클릭한 후 다음 동작을 해야 하는 경우가 많은데, 그럴 때는 아래와 같이 수정합니다.

예제 7-17 버튼 클릭 시 동작하는 대화상자의 Java 코드

... 생략

AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("제목입니다.");
dlg.setMessage("이곳이 내용입니다.");
dlg.setIcon(R.mipmap.ic_launcher);
dlg.setPositiveButton("확인", new DialogInterface.OnClickListener() {
	@Override
	public void onClick(DialogInterface dialogInterface, int i) {
		Toast.makeText(MainActivity.this, "확인을 눌렀네요", Toast.LENGTH_SHORT).show();
	}
});
dlg.show();

3-2 목록 대화상자

  • 대화상자에 리스트 형태의 목록을 출력하고 그 중 하나를 선택하게 할 수 있습니다.

예제 7-18 기본적인 목록 대화상자의 Java 코드

public class MainActivity extends AppCompatActivity{

    private static final String TAG = "MainActivity2";

    private Button btn1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        initLr();
    }

    public void init(){
        btn1 = findViewById(R.id.btn1);
    }

    public void initLr(){
        btn1.setOnClickListener(v ->{
            final String[] versionArray = new String[] {"파이", "Q(10)", "R(11)"};
            AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
            dlg.setTitle("좋아하는 버전은?");
            dlg.setIcon(R.mipmap.ic_launcher);
            dlg.setItems(versionArray, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    btn1.setText(versionArray[1]);
                }
            });
            dlg.setPositiveButton("닫기", null);
            dlg.show();
        });
    }
}

  • 위 예제는 항목의 선택과 동시에 대화상자가 닫힙니다.
  • 선택해도 대화상자가 닫히지 않도록하려면 setItems( ) 대신 setSingleChoiceItems( )를 사용하면 되는데, 이는 라디오버튼과 같은 형태로 출력됩니다.
  • setSingleChoiceItems 메서드는 setSingleChoiceItems(문자열 배열, 초기 선택 인덱스, 리스너)로 파라미터가 3개입니다.

예제 7-19 라디오버튼 목록 대화상자의 Java 코드

... 생략

public void initLr(){
      btn1.setOnClickListener(v ->{
            final String[] versionArray = new String[] {"파이", "Q(10)", "R(11)"};
            AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
            dlg.setTitle("좋아하는 버전은?");
            dlg.setIcon(R.mipmap.ic_launcher);
            dlg.setSingleChoiceItems(versionArray, 0, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    btn1.setText(versionArray[2]);
                }
            });
            dlg.setPositiveButton("닫기", null);
            dlg.show();
        });
    }

7-20 체크박스 목록 대화상자의 Java 코드


... 생략

 public void initLr(){
        btn1.setOnClickListener(v ->{
            final String[] versionArray = new String[] {"파이", "Q(10)", "R(11)"};
            final boolean[] checkArray = new boolean[] {true, false, false};
            AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
            dlg.setTitle("좋아하는 버전은?");
            dlg.setIcon(R.mipmap.ic_launcher);
            dlg.setMultiChoiceItems(versionArray, checkArray, new DialogInterface.OnMultiChoiceClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i, boolean b) {
                    btn1.setText(versionArray[0]);
                }
            });
            dlg.setPositiveButton("닫기", null);
            dlg.show();
        });
    }

실습 7-3 사용자 정보 입력 앱 만들기

예제 7-21 activity_main.xml

<androidx.appcompat.widget.LinearLayoutCompat
    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"
    android:gravity="center_horizontal"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tvName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:text="사용자 이름"/>
    <TextView
        android:id="@+id/tvEmail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:text="이메일"/>
    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="여기를 클릭" />

</androidx.appcompat.widget.LinearLayoutCompat>

예제 7-22 dialog1.xml

<androidx.appcompat.widget.LinearLayoutCompat
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="사용자 이름"
        android:textSize="20dp" />
    <EditText
        android:id="@+id/etName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="이메일"
        android:textSize="20dp" />
    <EditText
        android:id="@+id/etEmail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</androidx.appcompat.widget.LinearLayoutCompat>

예제 7-23 toast1.xml

<androidx.appcompat.widget.LinearLayoutCompat
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:background="@android:color/holo_red_dark"
    android:layout_height="match_parent"
    android:gravity="center">

    <ImageView
        android:layout_width="30dp"
        android:layout_height="27dp"
        android:src="@drawable/ic_star" />
    <TextView
        android:id="@+id/tvToast"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textStyle="bold"
        android:textSize="20dp" />
    <ImageView
        android:layout_width="30dp"
        android:layout_height="27dp"
        android:src="@drawable/ic_star" />

</androidx.appcompat.widget.LinearLayoutCompat>

예제 7-24, 25, 26, 27

public class MainActivity extends AppCompatActivity {

    private TextView tvName, tvEmail, tvToast;
    private Button btn1;
    private EditText etName, etEmail;
    private View dialogView, toastView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("사용자 정보 입력");

        init();
        initLr();
    }
    
    public void init(){
        tvName = findViewById(R.id.tvName);
        tvEmail = findViewById(R.id.tvEmail);
        btn1 = findViewById(R.id.btn1);
    }
    
    public void initLr(){
        btn1.setOnClickListener(v -> {
            dialogView = View.inflate(MainActivity.this, R.layout.dialog1, null);
            AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
            dlg.setTitle("사용자 정보 입력");
            dlg.setIcon(R.drawable.ic_person);
            dlg.setView(dialogView);
            dlg.setPositiveButton("확인", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    etName = dialogView.findViewById(R.id.etName);
                    etEmail = dialogView.findViewById(R.id.etEmail);

                    tvName.setTextColor(Integer.parseInt(etName.getText().toString()));
                    tvEmail.setTextColor(Integer.parseInt(etEmail.getText().toString()));
                }
            });
            dlg.setNegativeButton("취소", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    Toast toast = new Toast(MainActivity.this);
                    toastView = View.inflate(MainActivity.this, R.layout.toast1, null);
                    tvToast = toastView.findViewById(R.id.tvToast);
                    tvToast.setText("취소했습니다.");
                    toast.setView(toastView);
                    toast.show();
                }
            });
            dlg.show();
        });
    }
}

profile
Nil Desperandum <절대 절망하지 마라>

0개의 댓글