[TIL] #23 Custom View + Error...๐Ÿ˜ข

Yeonยท2023๋…„ 8์›” 23์ผ
0

๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ - Kotlin

๋ชฉ๋ก ๋ณด๊ธฐ
33/58
post-thumbnail

๐ŸŒป CustomView

1. CustomView?

  • ์•ˆ๋“œ๋กœ์ด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ UI ์š”์†Œ๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜์—ฌ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋งํ•จ

2. Why Create Custom Views?

  • ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๋ทฐ๋ฅผ ๋งŒ๋“ฆ์œผ๋กœ์จ ์กฐ๊ธˆ ๋” ์‰ฝ๊ฒŒ ๋ทฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด!
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฏธ๋ฆฌ ์ •์˜๋œ UI ์š”์†Œ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ์ด๋Ÿฌํ•œ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์š”์†Œ๋งŒ์œผ๋กœ๋Š” ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋•Œ ์ปค์Šคํ…€ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋ฉด ๋จ!

๐Ÿ˜ข Error...

์ปค์Šคํ…€ ๋ทฐ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ดค๋Š”๋ฐ ์•ฝ๊ฐ„์˜ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒผ๋‹ค.
๋ถ„๋ช… ๊ฐ๊ฐ์˜ ์‹ค์ œ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๋Š” ๊ฐ™์€๋ฐ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ๋“ค์‘ฅ๋‚ ์‘ฅํ•˜๋‹ค....

error

item๋“ค์˜ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ๋‹ค ๋˜‘๊ฐ™์ด ๋งž์ถ”๊ณ  ์‹ถ์–ด์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ์‹œ๋„ํ•ด๋ดค๋Š”๋ฐ ํ•ด๊ฒฐ์ด ์•ˆ๋˜์„œ ํŠœํ„ฐ๋‹˜ํ•œํ…Œ ์งˆ๋ฌธ์„ ํ–ˆ๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐ๋˜์„œ ์•ฝ๊ฐ„ ๋ฏผ๋งํ–ˆ๋‹ค๐Ÿ˜‚ ๋ฒ”์ธ์€ item.xml์— ์žˆ์—ˆ๋‹ค!!


1. Before

์ด๋ฏธ์ง€๊ฐ€ ๋“ค์‘ฅ๋‚ ์‘ฅํ•˜๊ฒŒ ๋‚˜์™”๋˜ ์ฝ”๋“œ์ด๋‹ค.

๐Ÿ–ค item.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="wrap_content"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/iconItem"
        android:layout_width="@dimen/icon_size"
        android:layout_height="@dimen/icon_size"
        android:layout_gravity="center_vertical"
        android:layout_weight="1"
        android:layout_marginHorizontal="10dp"
        android:padding="@dimen/icon_padding"
        android:scaleType="centerCrop"
        android:src="@drawable/sample_0" />

    <LinearLayout
        android:id="@+id/textContainer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textItem1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="Name"
            android:padding="@dimen/list_item_padding"
            android:textColor="@color/black"
            android:textSize="@dimen/list_item_text_size1" />

        <TextView
            android:id="@+id/textItem2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="EP"
            android:padding="@dimen/list_item_padding"
            android:textColor="@color/gray"
            android:textSize="@dimen/list_item_text_size2" />
    </LinearLayout>

</LinearLayout>

์ด๋ ‡๊ฒŒ๋งŒ ๋ด์„œ๋Š” ๋”ฑํžˆ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”๋ฐ ์™œ์ด๋Ÿฌ์ง€? ์ด๋Ÿฌ๋ฉด์„œ ๊ดœํžˆ ImageView์— LinearLayout๋„ ์”Œ์›Œ๋ดค๋‹ค๊ฐ€, scaleType๋„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋กœ ๋ฐ”๊ฟ”๋„ ๋ณด๊ณ , ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๊ฐ€ 1px์ด๋ผ๋„ ๋‹ค๋ฅด๋ฉด ์•ˆ๋˜๋‚˜ ์‹ถ์–ด์„œ ์‚ฌ์ด์ฆˆ๋„ ๋‹ค ๋˜‘๊ฐ™์ด ๋งž์ถ”๊ณ ,layout_weight๋ฅผ ์‚ญ์ œ๋„ ํ•ด๋ดค๋‹ค...
๊ทธ๋Ÿฐ๋ฐ layout_weight๋ฅผ ์‚ญ์ œํ–ˆ์„๋•Œ ์‚ฌ์ด์ฆˆ๋Š” ๋‹ค ๋˜‘๊ฐ™์€๋ฐ ๋„ˆ๋ฌด ์ž‘์•„์ ธ์„œ ์ด๊ฑด ์•„๋‹ˆ๊ตฌ๋‚˜ ์‹ถ์–ด์„œ ๋‹ค์‹œ ์“ฐ๊ณ ใ… ใ… ใ…œใ… ใ… ใ… ใ…œใ…œ

gptํ•œํ…Œ ๋ฌผ์–ด๋ด๋„ ์ด์ƒํ•œ ์†Œ๋ฆฌ๋งŒ ํ•ด์„œ ์‹ฌ๋ž€ํ–ˆ๋‹ค๐Ÿ˜ญ
์ด๋Ÿฌ๋‹ค๊ฐ€ ์ง„์ฃผ๋‹˜ํ•œํ…Œ ํ•˜์†Œ์—ฐ์„ ํ–ˆ๋Š”๋ฐ ํŠœํ„ฐ๋‹˜ํ•œํ…Œ ๋ฌผ์–ด๋ณด์ž๊ณ  ํ•˜์…จ๋‹น...๊ทธ๋™์•ˆ ํ•œ๋ฒˆ๋„ ์งˆ๋ฌธํ•ด๋ณธ์ ์ด ์—†์–ด์„œ ๊ฑฑ์ •ํ•˜๋‹ˆ๊นŒ ๊ฐ™์ด ๊ฐ€์ฃผ์…จ๋‹คใ…Žใ…Žใ…Ž


2. After

์ข…๋ฒ” ํŠœํ„ฐ๋‹˜์ด ์ฝ”๋“œ๋ฅผ ๋ณด์‹œ๊ณ  ๋ฐ”๋กœ ์ง‘์–ด์ฃผ์…จ๋‹ค!

1) ํŠœํ„ฐ๋‹˜ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

id/iconItem์— ์žˆ๋Š” layout_weight๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์„ ๋ง์”€ํ•ด์ฃผ์…จ๋‹ค!

<?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="wrap_content"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/iconItem"
        android:layout_width="@dimen/icon_size"
        android:layout_height="@dimen/icon_size"
        android:layout_gravity="center_vertical"
        android:padding="@dimen/icon_padding"
        android:scaleType="centerCrop"
        android:src="@drawable/sample_0" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textItem1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="Name"
            android:padding="@dimen/list_item_padding"
            android:textColor="@color/black"
            android:textSize="@dimen/list_item_text_size1" />

        <TextView
            android:id="@+id/textItem2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="EP"
            android:padding="@dimen/list_item_padding"
            android:textColor="@color/gray"
            android:textSize="@dimen/list_item_text_size2" />
    </LinearLayout>

</LinearLayout>

layout_weight๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ ๋‹ค ๋˜‘๊ฐ™์ด ๋œ๋‹ค. ์ด๊ฑด ๋‚˜๋„ ์‹œ๋„ํ–ˆ๋˜ ๊ฒƒ์ธ๋ฐ ๋„ˆ๋ฌด ์ž‘์•„์ ธ์„œ ๋‚ด๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•œ๊ฑด๊ฐ€ ํ•ด์„œ ๋˜๋Œ๋ฆฐ๊ฑด๋ฐ ๋งž๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค!!
๋Œ€์‹  ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ํ‚ค์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด dimen.xml์— ์ •์˜ํ•œ icon_size ๊ฐ’์„ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ด์ „์—๋Š” 60dp๋กœ ์„ค์ •ํ–ˆ์—ˆ๋Š”๋ฐ 100dp๋กœ ์ˆ˜์ •ํ•˜๋‹ˆ ์•„์ฃผ ๋ณด๊ธฐ ์ข‹์€ ์‚ฌ์ด์ฆˆ๋กœ ๋๋‹ค๐Ÿ˜Š


2) ๋‚ด ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

ํŠœํ„ฐ๋‹˜์ด ์•Œ๋ ค์ฃผ์‹  ๋ฐฉ๋ฒ• ๋ง๊ณ ๋„ ๋˜ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ๋ญ๊ฐ€ ์žˆ์„์ง€ ์ด๊ฒƒ์ €๊ฒƒ ๋˜ ๋งŒ์ ธ๋ณด๋‹ค๊ฐ€ id/iconItem์˜ sibling elements์ธ id/textContainer์˜ layout_width ๊ฐ’์„ wrap_content์—์„œ0dp๋กœ ์ˆ˜์ •ํ•ด๋ดค๋‹ค.

<?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="wrap_content"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/iconItem"
        android:layout_width="@dimen/icon_size"
        android:layout_height="@dimen/icon_size"
        android:layout_gravity="center_vertical"
        android:layout_weight="1"
        android:padding="@dimen/icon_padding"
        android:scaleType="centerCrop"
        android:src="@drawable/sample_0" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textItem1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="Name"
            android:padding="@dimen/list_item_padding"
            android:textColor="@color/black"
            android:textSize="@dimen/list_item_text_size1" />

        <TextView
            android:id="@+id/textItem2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="EP"
            android:padding="@dimen/list_item_padding"
            android:textColor="@color/gray"
            android:textSize="@dimen/list_item_text_size2" />
    </LinearLayout>

</LinearLayout>

id/iconItem์˜ layout_weight๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ์ฑ„ ํ–ˆ๋Š”๋ฐ๋„ ์ด๋ฏธ์ง€๋“ค์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ผ์ •ํ•˜๋‹ค!

๋˜ ๋‹ค๋ฅธ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฑธ๋กœ๋„ ๋งŒ์กฑํ•œ๋‹ค๐Ÿ˜Š

result




[์ฐธ๊ณ  ์‚ฌ์ดํŠธ]

'Customview', developers

0๊ฐœ์˜ ๋Œ“๊ธ€