2024. 4. 9. 18:33, ๐ฑAndroid Study
๋ฐ์ํ
๋ํ์์ | Views | Android Developers
์ด ํ์ด์ง๋ Cloud Translation API๋ฅผ ํตํด ๋ฒ์ญ๋์์ต๋๋ค. ๋ํ์์ ์ปฌ๋ ์ ์ ์ฌ์ฉํด ์ ๋ฆฌํ๊ธฐ ๋ด ํ๊ฒฝ์ค์ ์ ๊ธฐ์ค์ผ๋ก ์ฝํ ์ธ ๋ฅผ ์ ์ฅํ๊ณ ๋ถ๋ฅํ์ธ์. Compose ๋ฐฉ๋ฒ ์ฌ์ฉํด ๋ณด๊ธฐ Jetpack Compose๋ Android
developer.android.com
1. ๋ค์ด์ผ๋ก๊ทธ (Dialog, ๋ํ์์)
- ์ฌ์ฉ์์๊ฒ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ฑฐ๋ ์ถ๊ฐ์ ๋ณด๋ฅผ ์ ๋ ฅํ๋ผ๋ ๋ฉ์์ง๋ฅผ ํ์ํ๋ ์์ ์ฐฝ
- ํ๋ฉด์ ๊ฐ๋ ์ฑ์ฐ์ง ์์ผ๋ฉฐ ๋ณดํต์ ์ฌ์ฉ์๊ฐ ๋ค์์ผ๋ก ๊ณ์ ์งํํ๊ธฐ ์ ์ ์กฐ์น๋ฅผ ์ทจํด์ผ ํ๋ ๋ชจ๋ฌ ์ด๋ฒคํธ์ ์ฌ์ฉ
2. ๋ค์ด์ผ๋ก๊ทธ ๊ตฌ์กฐ
- AlertDialogํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ง ๋ํ ์์ ๋์์ธ์ ๋น๋ ๊ฐ๋ฅ
- ๋๊ฐ ์ด ๋ค์ด์ผ๋ก๊ทธ ํด๋์ค๋ง ์์ผ๋ฉด ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์
1. ์ ๋ชฉ (์ ํ)
- ์ ํ ์ฌํญ (๋จ์ํ ๋ฉ์์ง ๋๋ ์ง๋ฌธ์ ๋ํ๋ด์ผ ํ๋ ๊ฒฝ์ฐ ์์ด๋ ๋จ)
- ์ฝํ ์ธ ์์ญ์ ์์ธํ ๋ฉ์์ง,๋ชฉ๋ก ๋๋ ๋ง์ถค ๋ ์ด์์์ด ์ฑ์์ ธ ์๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ
2. ์ฝํ ์ธ ์์ญ
- ๋ฉ์์ง, ๋ชฉ๋ก ๋๋ ๋ค๋ฅธ ๋ง์ถค ๋ ์ด์์์ ํ์ ํ ์ ์์
3. ์์ ๋ฒํผ
- ๋ํ ์์ ํ๋์ ์์ ๋ฒํผ์ด ์ธ ๊ฐ๋ฅผ ์ด๊ณผํ๋ฉด ์ ๋จ
3. ๋ค์ด์ผ๋ก๊ทธ ์์
3-1. ๊ธฐ๋ณธ ๋ค์ด์ผ๋ก๊ทธ
// 1. ๊ธฐ๋ณธ ๋ค์ด์ผ๋ก๊ทธ
binding.btn1Alert.setOnClickListener {
var builder = AlertDialog.Builder(this)
builder.setTitle("๊ธฐ๋ณธ ๋ค์ด์ผ๋ก๊ทธ ํ์ดํ")
builder.setMessage("๊ธฐ๋ณธ ๋ค์ด์ผ๋ก๊ทธ ๋ฉ์ธ์ง")
builder.setIcon(R.mipmap.ic_launcher)
// ๋ฒํผ ํด๋ฆญ์์ ๋ฌด์จ ์์
์ ํ ๊ฒ์ธ๊ฐ!
val listener = object : DialogInterface.OnClickListener {
override fun onClick(p0: DialogInterface?, p1: Int) {
when (p1) {
DialogInterface.BUTTON_POSITIVE ->
binding.tvTitle.text = "BUTTON_POSITIVE"
DialogInterface.BUTTON_NEUTRAL ->
binding.tvTitle.text = "BUTTON_NEUTRAL"
DialogInterface.BUTTON_NEGATIVE ->
binding.tvTitle.text = "BUTTON_NEGATIVE"
}
}
}
builder.setPositiveButton("Positive", listener)
builder.setNegativeButton("Negative", listener)
builder.setNeutralButton("Neutral", listener)
builder.show()
}
3-2. ์ปค์คํ ๋ค์ด์ผ๋ก๊ทธ
binding.btn2Custom.setOnClickListener {
val builder = AlertDialog.Builder(this)
builder.setTitle("์ปค์คํ
๋ค์ด์ผ๋ก๊ทธ")
builder.setIcon(R.mipmap.ic_launcher)
val v1 = layoutInflater.inflate(R.layout.dialog, null)
builder.setView(v1)
// p0์ ํด๋น AlertDialog๊ฐ ๋ค์ด์จ๋ค. findViewById๋ฅผ ํตํด view๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉ
val listener = DialogInterface.OnClickListener { p0, p1 ->
val alert = p0 as AlertDialog
val edit1: EditText? = alert.findViewById<EditText>(R.id.editText)
val edit2: EditText? = alert.findViewById<EditText>(R.id.editText2)
binding.tvTitle.text = "์ด๋ฆ : ${edit1?.text}"
binding.tvTitle.append(" / ๋์ด : ${edit2?.text}")
}
builder.setPositiveButton("ํ์ธ", listener)
builder.setNegativeButton("์ทจ์", null)
builder.show()
}
dialog.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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:orientation="vertical">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:text="Name" />
<EditText
android:id="@+id/editText2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:text="AGE" />
</LinearLayout>
</LinearLayout>
3-3. ๋ ์ง ๋ค์ด์ผ๋ก๊ทธ (DatePicker Dialog)
binding.btn3Date.setOnClickListener {
val calendar = Calendar.getInstance()
val year = calendar.get(Calendar.YEAR)
val month = calendar.get(Calendar.MONTH)
val day = calendar.get(Calendar.DAY_OF_MONTH)
val listener = DatePickerDialog.OnDateSetListener { datePicker, i, i2, i3 ->
// i๋
i2์ i3์ผ
binding.tvTitle.text = "${i}๋
${i2 + 1}์ ${i3}์ผ"
}
var picker = DatePickerDialog(this, listener, year, month, day)
picker.show()
}
3-4. ์๊ฐ ๋ค์ด์ผ๋ก๊ทธ (TimePicker Dialog)
binding.btn4Time.setOnClickListener {
val calendar = Calendar.getInstance()
val hour = calendar.get(Calendar.HOUR)
val minute = calendar.get(Calendar.MINUTE)
val listener = TimePickerDialog.OnTimeSetListener { timePicker, i, i2 ->
binding.tvTitle.text = "${i}์ ${i2}๋ถ"
}
val picker = TimePickerDialog(this, listener, hour, minute, false) // trueํ๋ฉด 24์๊ฐ ์
picker.show()
}
3-5. ์งํ ๋ค์ด์ผ๋ก๊ทธ (Progress Dialog)
binding.btn5Porgress.setOnClickListener {
// ๊ถ์ฅํ์ง ์์ง๋ง ์ฌ์ฉ์ ๊ฐ๋ฅํ๋ค.
pro = ProgressDialog.show(this, "ํ์ดํ์
๋๋ค.", "๋ฉ์์ง์
๋๋ค.")
// ํธ๋ค๋ฌ๋ฅผ ํตํด์ ์ข
๋ฃ ์์
์ ํ๋ค.
val handler = Handler()
val thread = Runnable { pro?.cancel() }
handler.postDelayed(thread, 5000) // ๋๋ ์ด๋ 5์ด
}
ํ๋ก๊ทธ๋์ค ๋ค์ด์ผ๋ก๊ทธ ๋ค๋ฅธ ๋ฐฉ์ : (์ปค์คํ
๊ณผ ๋น์ท)
binding.btn5Porgress.setOnClickListener {
val builder = AlertDialog.Builder(this)
builder.setTitle("ํ๋ก๊ทธ๋์ค๋ฐ")
builder.setIcon(R.mipmap.ic_launcher)
val v1 = layoutInflater.inflate(R.layout.progressbar, null)
builder.setView(v1)
builder.show()
}
progressbar.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:gravity="center"
android:orientation="vertical">
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="match_parent"
android:layout_height="76dp"
android:layout_gravity="center"
android:layout_marginTop="48dp"
android:indeterminate="false"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="loading..."
android:textSize="16sp"
android:layout_marginTop="16dp"/>
</LinearLayout>
4. DialogFragment
- DialogFragment๋ ์๋๋ก์ด๋์์ ๋ํ์์ ํํ์ UI๋ฅผ ๊ตฌํํ ๋ ์ฌ์ฉํ๋ ํด๋์ค
- Fragment ํด๋์ค๋ฅผ ์์๋ฐ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉด์, ์ถ๊ฐ๋ก ๋ํ์์๋ฅผ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์์
- DialogFragment๋ฅผ ์ฌ์ฉํ๋ฉด ๋ํ์์์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๋์ฑ ์ธ๋ฐํ๊ฒ ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ,
ํ๋ฉด ํ์ ๊ฐ์ ๊ตฌ์ฑ ๋ณ๊ฒฝ ์์๋ ๋ํ์์์ ์ํ๋ฅผ ์ ์งํ ์ ์์ - DialogFragment์ ์ฌ๋ฌ ์ฉ๋
- ์ ํต์ ์ธ ๋ํ์์
- ๋ถ๋ชจ ์กํฐ๋นํฐ์ ์ปจํ ์คํธ ๋ด์์ ์คํ๋๋ ๋ด์ฅ๋ ํ๋๊ทธ๋จผํธ
- ๋ํ์์์ ์ ์ฌํ UI๋ฅผ ๊ฐ์ง ์ ์ฒด ํ๋ฉด ํ๋๊ทธ๋จผํธ - ์ฌ์ฉ์์๊ฒ ๊ฒฐ์ ์ ์๊ตฌํ๊ฑฐ๋, ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ๊ฑฐ๋, ์๋ฆผ์ ์ ๊ณตํ๋ ๋ฑ์ ์ฌ์ฉ๋จ
MainActivity.kt
๋ฒํผ์ ํด๋ฆญํ๋ฉด MyDialogFragment๋ฅผ ํ์
show ๋ฉ์๋๋ FragmentManager์ ๋ํ์์์ ํ๊ทธ๋ฅผ ์ธ์๋ก ๋ฐ์
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Show the dialog by calling show() method
findViewById<Button>(R.id.showDialogButton).setOnClickListener {
MyDialogFragment().show(supportFragmentManager, "MyDialogFragment")
}
}
}
MyDialogFragment.kt
onCreateDialog ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ AlertDialog๋ฅผ ์์ฑํ๊ณ ๊ตฌ์ฑ
๋ํ์์์๋ ๋ฉ์์ง์ ๋ ๊ฐ์ ๋ฒํผ("Yes"์ "No")์ด ์์ผ๋ฉฐ,
๊ฐ ๋ฒํผ์ ๋๋ ์ ๋์ ๋์์ ์ด ์์ ์์๋ ์ ์๋์ง ์์
class MyDialogFragment : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return activity?.let {
// Use the Builder class for convenient dialog construction
val builder = AlertDialog.Builder(it)
builder.setMessage("Do you like this app?")
.setPositiveButton("Yes") { dialog, id ->
// Send the positive button event back to the host activity
}
.setNegativeButton("No") { dialog, id ->
// Send the negative button event back to the host activity
}
// Create the AlertDialog object and return it
builder.create()
} ?: throw IllegalStateException("Activity cannot be null")
}
}
๋ฐ์ํ
๐ฌ C O M M E N T