[Android] XML로부터 View 생성하기

안드로이드는 UI의 구성을 XML로 정의하여 생성한다. 아래는 UI를 위한 XML인 map_legend_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="vertical" >

    <LinearLayout
        android:paddingHorizontal="15dp"
        android:layout_width="match_parent"
        android:layout_height="54dp"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <Switch
            android:id="@+id/swLayerVisibility"
            android:layout_weight="0"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <geoservice.nexgen.maplegend.LegendSingleSymbol
            android:id="@+id/lssItem"
            android:layout_width="36dp"
            android:layout_height="36dp" />

        <Space
            android:layout_width="5dp"
            android:layout_height="1px" />

        <TextView
            android:layout_weight="1"
            android:id="@+id/tvLayerName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="@dimen/normal_text_size"
            android:textStyle="bold"
            android:text="LayerName" />


    </LinearLayout>
</LinearLayout>

위의 XML을 통해 View를 생성하는 코드는 다음과 같다.

for( ... ) {
    val itemLayout = inflater.inflate(R.layout.map_legend_item, null, false)
    itemLayout.findViewById<TextView>(R.id.tvLayerName).setText(title)

    ...

    mainLayout.addView(itemLayout)
}

위의 코드 중 inflater는 다음 3가지 방식 중 하나를 통해 생성된다.

val inflater = layoutInflater
val inflater = LayoutInflater.from(this)
val inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater

위의 코드를 통한 실제 결과는 다음과 같다.

[Kotlin] Inner Class

Inner Class는 어떤 클래스(A라고 하자)의 내부에 정의되는데.. 이 Inner Class는 바로 객체화 될수 없고, 먼저 A 클래스를 객체화한 뒤 객체화된 것을 통해 생성된다.

아래는 코틀린의 문법 중 Inner Class에 대한 예제이다.

open class Base {
    open val c: String = "Dip2K"
    open fun f() = println("Programmer, ${c}")
}

class Derived: Base() {
    override  val c: String = "Super ${super.c}"
    override fun f() = println("Developer, ${c}")

    inner class InnerClass {
        constructor() {
            println("InnerClass's constructor")
        }

        fun f() = println("InnerClass's fun: f")
        fun t() {
            f()
            Derived().f()
            super@Derived.f()
        }
    }
}

fun main() {
    val c = Derived()
    val i = c.InnerClass()

    i.t()
}

Inner Class를 기준으로 바깓 클래스 및 그 바깓 클래스의 부모 클래스에 대한 프로퍼티와 함수에 대한 접근에 대한 문법을 나타내고 있다. 실행결과는 다음과 같다.

InnerClass's constructor
InnerClass's fun: f
Developer, Super Dip2K
Programmer, Super Dip2K