본문 바로가기
Android/Kotlin App

[Kotlin App] 목록 대화상자

by 태옹 2021. 4. 19.

대화상자(dialog)

화면에 메시지를 나타낸 후 확인이나 취소같은 사용자의 선택을 받아들이는 경우에 사용함

토스트보다 좀 더 강력한 메시지를 보여줄 때 적당함

 

 

 

  1. 대화상자 생성
    • AlertDialog.Builder클래스로 생성
  2. 용도에 따른 설정
    • setTitle() : 제목 설정
    • setMessage() : 내용 입력
    • setIcon() : 아이콘 설정
    • setPositiveButton() : 확인버튼
    • setNegativeButton() : 취소버튼
    • setItems() : 목록 출력
    • setSingleChoiceItems : 라디오버튼 목록 출력
    • setMultiChoiceItems : 체크박스 목록 출력
  3. 대화상자 화면 출력
    • show()

 

단순 메시지 출력

var dlg = AlertDialog.Builder(this@MainActivity)
dlg.setTitle("제목입니다")
dlg.setMessage("단순 메시지 내용이 나옵니다")
dlg.setIcon(R.mipmap.ic_launcher)
dlg.setPositiveButton("확인", null)	//null로 설정했기 때문에 버튼을 눌러도 창만 닫힘
dlg.setNegativeButton("취소", null)
dlg.show()

아래 코드처럼 positiveButton(혹은 negativeButton)에 코드를 작성할 수 있음

dlg.setPositiveButton("확인"){dialogInterface, i ->
	Toast.makeText(this, "확인을 눌렀어요",Toast.LENGTH_SHORT).show()	//toast메시지 띄움
}

 

 

배열 데이터 하나 추출

  • setItems(배열)
  • 선택하면 창 닫힘
var animalArray = arrayOf("고양이","강아지","병아리")
var dlg = AlertDialog.Builder(this@MainActivity)
dlg.setTitle("배열 데이터 출력")
dlg.setItems(animalArray){dialogInterface, i -> 
	입력을 받을 위젯.text = animalArray[i]
}

 

배열 데이터 하나 추출

  • setSingleChoiceItems(배열, 초기 선택 인덱스)
  • setItems와의 차이 : 선택해도 확인 누르기 전에 창 닫히지 않음
  • 라디오버튼 형태
  • 항목을 선택해도 대화상자가 닫히지 않도록 setItems() 대신 사용ㅅ

 

dlg.setSingleChoiceItems(animalArray,0){dialogInterface, i -> 
	입력을 받을 위젯.text = animalArray[i]
}

 

배열 데이터 복수개 추출

  • setMultiChoiceItems(데이터배열, T/F값 배열)
  • 여러 개를 동시에 선택할 때 사용
  • 체크박스 형태로 표시됨
  • true, false값을 저장할 배열을 선언해줘야함
var animalArray = arrayOf("고양이","강아지","병아리")
var checkArray = booleanArrayOf(true, false, false)
dlg.setMultiChoiceItems(animalArray, checkArray){dialogInterface, i, b ->
	입력을 받을 위젯.text = animalArray[i]
}

 

xml화면 띄우기

  • View.inflate() -> setView()
var dialogView = View.inflate(this@MainActivity, R.layout.inputlayout, null)
dlg.setView(dialogView)

 

 


 

xml화면을 이용한 대화상자 생성 실습 코드

 

주요기능 

1. 콘텍스트 메뉴로 대화상자를 띄움

2. 기존에 기록된 정보를 대화상자로 불러옴

 

activity_main.xml

더보기
<?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:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <TextView
        android:id="@+id/tvName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="사용자 이름"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/tvEmail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="이메일"
        android:textSize="18sp"/>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="정보 수정" />
</LinearLayout>

 

inputlayout.xml

더보기
<?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"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">


    <TextView
        android:id="@+id/tv1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="사용자 이름" />

    <EditText
        android:id="@+id/userName_insert"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="Name" />

    <TextView
        android:id="@+id/tv2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="이메일" />

    <EditText
        android:id="@+id/userEmail_insert"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="Email" />
</LinearLayout>

 

updatelayout.xml

더보기
<?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"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="사용자 이름" />

    <EditText
        android:id="@+id/userName_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="Name" />

    <TextView
        android:id="@+id/tv4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="이메일" />

    <EditText
        android:id="@+id/userEmail_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="Email" />
</LinearLayout>

 

menu1.xml

더보기
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/insert"
        android:title="사용자 정보 입력" />
    <item
        android:id="@+id/update"
        android:title="사용자 정보 수정" />
</menu>

 

MainActivity.kt

더보기
package com.cookandroid.kotlinmidterm4

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.ContextMenu
import android.view.MenuItem
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.inputlayout.*
import kotlinx.android.synthetic.main.inputlayout.view.*
import kotlinx.android.synthetic.main.updatelayout.*
import kotlinx.android.synthetic.main.updatelayout.view.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        registerForContextMenu(button)
    }

    override fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo?) {
        super.onCreateContextMenu(menu, v, menuInfo)
        var mInflater = this.menuInflater
        if(v===button){
            menu!!.setHeaderTitle("사용자 정보")
            mInflater.inflate(R.menu.menu1, menu)
        }
        //추가 if문으로 다수의 위젯에 context menu를 부착할 수 있음
    }

    override fun onContextItemSelected(item: MenuItem): Boolean {
        when(item.itemId){
            R.id.insert->{
                var dialogView = View.inflate(this@MainActivity, R.layout.inputlayout, null)
                var dlg = AlertDialog.Builder(this@MainActivity)
                dlg.setTitle("사용자 정보 입력")
                dlg.setIcon(R.drawable.ic_menu_allfriends)
                dlg.setView(dialogView)
                dlg.setPositiveButton("확인"){dialogInterface, i ->
                    tvName.text = dialogView.userName_insert.text.toString()
                    tvEmail.text = dialogView.userEmail_insert.text.toString()
                }
                dlg.setNegativeButton("취소"){dialogInterface, i ->
                    Toast.makeText(this, "취소했습니다",Toast.LENGTH_SHORT).show()
                }
                dlg.show()
            }
            R.id.update->{
                var name = tvName.text.toString()
                var email = tvEmail.text.toString()
                var dialogView = View.inflate(this@MainActivity, R.layout.updatelayout, null)
                var dlg = AlertDialog.Builder(this@MainActivity)
                dlg.setTitle("사용자 기존 정보 수정")
                dlg.setIcon(R.drawable.ic_menu_allfriends)
                dlg.setView(dialogView)
                dialogView.userName_update.setText(name)
                dialogView.userEmail_update.setText(email)
                dlg.setPositiveButton("확인"){dialogInterface, i ->
                    tvName.text = dialogView.userName_update.text.toString()
                    tvEmail.text = dialogView.userEmail_update.text.toString()
                }
                dlg.setNegativeButton("취소"){dialogInterface, i ->
                    Toast.makeText(this, "취소했습니다",Toast.LENGTH_SHORT).show()
                }
                dlg.show()
            }
        }
        return true
    }

}

 

댓글