iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【Android】カスタムビューのカスタム属性を設定する

今回は、以前の「カスタムビューの作成」に引き続き、カスタムビューでカスタム属性を追加・適用する方法をメモ程度に残しておきます👷‍♀️

それではやっていく

まずは、カスタム属性を定義するための xmlres/values 配下に attrs_account_type_select.xml というファイルを作成します(ファイル名は適宜変更してください)。

ファイルの中身は下記のように定義しました。<attr> タグでカスタム属性を定義します。name には属性の名前を、format には属性の値を設定します。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="AccountTypeSelectView">
        <attr name="fideeAccountType" format="enum">
            <enum name="normal" value="0"/>
            <enum name="guide" value="1"/>
        </attr>
    </declare-styleable>
</resources>

今回は fideeAccountType という列挙型のカスタム属性を定義しています。format として定義できる値については下記を参考にしてみてください👀

stackoverflow.com

次に、レイアウトファイルから fideeAccountType を指定してみます。

<yamatootaka.fidee.presentation.view.onboard.signup.view.AccountTypeSelectableView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginEnd="32dp"
            android:layout_weight="1"
            custom:fideeAccountType="guide"/>

この custom という name space がカスタム属性の指定に使用され、androidname space と同様にレイアウトのルートで下記のように指定しています。

<androidx.constraintlayout.widget.ConstraintLayout
    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"
    xmlns:custom="http://schemas.android.com/apk/res-auto"

最後にカスタムビューのクラスから下記のように、カスタム属性を元に View のデザインを変更しています。

package yamatootaka.fidee.presentation.view.onboard.signup.view

import android.content.Context
import android.util.AttributeSet
import android.view.View
import android.widget.LinearLayout
import android.widget.TextView
import yamatootaka.fidee.R

class AccountTypeSelectableView(context : Context, attributeSet : AttributeSet): LinearLayout(context, attributeSet) {
    private val accountType: Int
    private val textView: TextView

    init {
        View.inflate(context, R.layout.view_account_type_selectable, this)
        context.theme.obtainStyledAttributes(
            attributeSet,
            R.styleable.AccountTypeSelectableView,
            0, 0).apply {
            try {
                accountType = getInteger(R.styleable.AccountTypeSelectableView_fideeAccountType, 0) 
            } finally {
                recycle()
            }
        }
        textView = findViewById(R.id.account_type_text_view)

        when (accountType) {
            0 -> {
                textView.text = "一般"
            }
            1 -> {
                textView.text = "ガイド"
            }
            else -> {}
        }
    }
}

カスタム属性の適用に関して詳しく知りたい場合は、公式ドキュメントを参照してみてください。

developer.android.com

という感じで本日も以上になります👋

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com