【Android】カスタムビューのカスタム属性を設定する
今回は、以前の「カスタムビューの作成」に引き続き、カスタムビューでカスタム属性を追加・適用する方法をメモ程度に残しておきます👷♀️
それではやっていく
まずは、カスタム属性を定義するための xml
を res/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
として定義できる値については下記を参考にしてみてください👀
次に、レイアウトファイルから 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
がカスタム属性の指定に使用され、android
の name 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 -> {} } } }
カスタム属性の適用に関して詳しく知りたい場合は、公式ドキュメントを参照してみてください。
という感じで本日も以上になります👋