[Android/Kotlin] 버튼누르면 뜨는 Dialog 만들기

2023. 1. 29. 10:17교내활동/Programming GURU2

반응형

생각해보면.. 참 쉬웠던건데.. 이것도 엄청 헤맸다.

수업을 듣긴 했으나 기억에 남는게 없다보니 구글링이 날 살렸다. 

 

코드를 어떻게든 줄이고 레이아웃도 좀 줄여보려고 했던건데.. 내 능력 밖의 일임을 깨달았고

팀원의 도움으로 결국에는 무식하게 코드를 짰다.

 

처음에 하던 방법도 팀원이 이야기해줬던건데 안뜬다. 왜인지 모르겠다.

더 고민하고있다가 마감도 못칠 것 같아 그냥 엎었다.

00아 너가 고생했다 사랑한다

 

<fragment_home.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:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:visibility="visible">

                <!-- 상단 3개 -->
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal"
                    android:paddingLeft="10dp"
                    android:paddingRight="10dp">

                    <ImageButton
                        android:id="@+id/btnTrash"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:adjustViewBounds="true"
                        android:paddingRight="5dp"
                        android:scaleType="fitXY"
                        android:src="@drawable/trash_btn"
                        tools:ignore="SpeakableTextPresentCheck" />

                    <ImageButton
                        android:id="@+id/btnGlass"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:adjustViewBounds="true"
                        android:paddingRight="5dp"
                        android:scaleType="fitXY"
                        android:src="@drawable/glass_btn"
                        tools:ignore="SpeakableTextPresentCheck" />

                    <ImageButton
                        android:id="@+id/btnPaper"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:adjustViewBounds="true"
                        android:scaleType="fitXY"
                        android:src="@drawable/paper_btn"
                        tools:ignore="SpeakableTextPresentCheck" />

                </LinearLayout>

                <!-- 하단 3개 -->
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal"
                    android:paddingLeft="10dp"
                    android:paddingRight="10dp">

                    <ImageButton
                        android:id="@+id/btnPlastic"
                        android:layout_width="wrap_content"
                        android:layout_height="144dp"
                        android:layout_weight="1"
                        android:paddingRight="5dp"
                        android:scaleType="fitXY"
                        android:src="@drawable/plastic_btn"
                        tools:ignore="SpeakableTextPresentCheck" />

                    <ImageButton
                        android:id="@+id/btnVinyl"
                        android:layout_width="wrap_content"
                        android:layout_height="142dp"
                        android:layout_weight="1"
                        android:paddingRight="5dp"
                        android:scaleType="fitXY"
                        android:src="@drawable/vinyl_btn"
                        tools:ignore="SpeakableTextPresentCheck" />

                    <ImageButton
                        android:id="@+id/btnCan"
                        android:layout_width="wrap_content"
                        android:layout_height="139dp"
                        android:layout_weight="1"
                        android:scaleType="fitXY"
                        android:src="@drawable/can_btn"
                        tools:ignore="SpeakableTextPresentCheck" />

                </LinearLayout>

            </LinearLayout>

사실 이  레이아웃은 좀 망한 레이아웃이다.

지금생각해도 어이가 없다.

왜 Linear로 감싸서 썼을까? 그냥 Table 쓰면 될텐데...

 

<FragmentHome.kt>

import android.app.AlertDialog
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton

class HomeFragment : Fragment() {

    // 분리수거 안내 버튼
    lateinit var btnTrash : ImageButton
    lateinit var btnGlass: ImageButton
    lateinit var btnPaper: ImageButton
    lateinit var btnPlastic : ImageButton
    lateinit var btnVinyl : ImageButton
    lateinit var btnCan : ImageButton


    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    ): View? {

        val view = inflater.inflate(R.layout.fragment_home, container, false)

        val hActivity = activity as HomeActivity

        // 버튼 클릭 시 분리수거 방법
        btnTrash = view.findViewById(R.id.btnTrash)
        btnGlass = view.findViewById(R.id.btnGlass)
        btnPaper = view.findViewById(R.id.btnPaper)
        btnPlastic = view.findViewById(R.id.btnPlastic)
        btnVinyl = view.findViewById(R.id.btnVinyl)
        btnCan = view.findViewById(R.id.btnCan)
		
        // 일반 쓰레기
        btnTrash.setOnClickListener {
            var dialogView = View.inflate(hActivity, R.layout.dialog_trash, null)
            var dlg = AlertDialog.Builder(hActivity)
            dlg.setTitle("일반쓰레기 배출 방법")
            dlg.setView(dialogView)
            dlg.setCancelable(true)
            dlg.setPositiveButton("확인", null)
            dlg.show()
        }
		
        // 유리
        btnGlass.setOnClickListener {
            var dialogView = View.inflate(hActivity, R.layout.dialog_glass, null)
            var dlg = AlertDialog.Builder(hActivity)
            dlg.setTitle("유리 배출 방법")
            dlg.setView(dialogView)
            dlg.setCancelable(true)
            dlg.setPositiveButton("확인", null)
            dlg.show()

        }
		
        // 종이
        btnPaper.setOnClickListener {
            var dialogView = View.inflate(hActivity, R.layout.dialog_paper, null)
            var dlg = AlertDialog.Builder(hActivity)
            dlg.setTitle("종이 배출 방법")
            dlg.setView(dialogView)
            dlg.setCancelable(true)
            dlg.setPositiveButton("확인", null)
            dlg.show()

        }
		// 플라스틱
        btnPlastic.setOnClickListener {
            var dialogView = View.inflate(hActivity, R.layout.dialog_plastic, null)
            var dlg = AlertDialog.Builder(hActivity)
            dlg.setTitle("플라스틱 배출 방법")
            dlg.setView(dialogView)
            dlg.setCancelable(true)
            dlg.setPositiveButton("확인", null)
            dlg.show()
        }
		
        // 비닐
        btnVinyl.setOnClickListener {
            var dialogView = View.inflate(hActivity, R.layout.dialog_vinyl, null)
            var dlg = AlertDialog.Builder(hActivity)
            dlg.setTitle("비닐 배출 방법")
            dlg.setView(dialogView)
            dlg.setCancelable(true)
            dlg.setPositiveButton("확인", null)
            dlg.show()
        }
		// 캔
        btnCan.setOnClickListener {
            var dialogView = View.inflate(hActivity, R.layout.dialog_can, null)
            var dlg = AlertDialog.Builder(hActivity)
            dlg.setTitle("캔 배출 방법")
            dlg.setView(dialogView)
            dlg.setCancelable(true)
            dlg.setPositiveButton("확인", null)
            dlg.show()
        }


        return view
    }


}

마찬가지로 Fragment에서 작업하던 것이다보니 findViewById()를 바로 사용할 수 없다.

그래서 view = inflater.inflate() 을 통해 액티비티에서 사용하는 것 처럼 쓸 수 있었다.

 

아직도 context라는 개념이 잘 잡히지는 않았으나, Activity는 context를 상속받았지만 Fragment는 상속받지 않았다는 점만 확실하게 알았고, context 관련한 것들을 Fragment에서 사용하고 싶을 때는 Fragment가 올라가는 Activity를 가져와서 사용하면 된다는 점을 알게 되었다.

<dialog_view.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">


    <ImageView
        android:id="@+id/can"
        android:src="@drawable/img_can"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"/>

</LinearLayout>

이런식으로 각 분류별로 dialog xml 파일을 만들어주어 적용시켰다.

 

 

앱개발은 어렵다

반응형