대화상자(dialog)
화면에 메시지를 나타낸 후 확인이나 취소같은 사용자의 선택을 받아들이는 경우에 사용함
토스트보다 좀 더 강력한 메시지를 보여줄 때 적당함
- 대화상자 생성
- AlertDialog.Builder클래스로 생성
- 용도에 따른 설정
- setTitle() : 제목 설정
- setMessage() : 내용 입력
- setIcon() : 아이콘 설정
- setPositiveButton() : 확인버튼
- setNegativeButton() : 취소버튼
- setItems() : 목록 출력
- setSingleChoiceItems : 라디오버튼 목록 출력
- setMultiChoiceItems : 체크박스 목록 출력
- 대화상자 화면 출력
- 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
}
}
'Android > Kotlin App' 카테고리의 다른 글
[Kotlin App] Action Bar와 Flagment (0) | 2021.05.04 |
---|---|
[Kotlin App] TabHost (0) | 2021.05.03 |
[Kotlin] ?(물음표)와 !!(느낌표 두개)의 사용 (0) | 2021.04.17 |
[Kotlin App] 메뉴 - 옵션메뉴, 컨텍스트 메뉴 (0) | 2021.04.16 |
[Kotlin App] 액티비티 / 인텐트 (0) | 2021.04.13 |
댓글