View から継承するカスタム Android UI コントロールを開発しましたが、レイアウト XML でネイティブ コントロールなどの属性を自由に設定したいのですが、どうすればよいですか? 3 つのステップで:
ステップ 1: res/values ディレクトリに attrs.xml を作成し、カスタム属性を宣言する
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="PointCaptureView">
<attr name="pcv_curve_color" format="color|reference"/>
</declare-styleable>
</resources>
上記の例では、declare-styleable ノードの名前はコントロールの名前であり、以下のサブノードはカスタム属性であり、複数で宣言して 1 つずつ追加できます。ここでは、タイプがカラー値である pcv_curve_color というプロパティを定義します。
ステップ 2: カスタム コントロール クラスのコンストラクターでカスタム プロパティ値を読み取る
class PointCaptureView : View {
constructor(context: Context, attr: AttributeSet?, @AttrRes defStyleAttr: Int) : super(context, attr, defStyleAttr) {
val a = context.obtainStyledAttributes(attr, R.styleable.PointCaptureView, defStyleAttr, 0)
canvasPaintColor = a.getColor(R.styleable.PointCaptureView_pcv_curve_color, Color.YELLOW)
a.recycle() // 别忘了这一句
// 其他初始化代码
// ...
}
}
ステップ 3: レイアウト XML でカスタム属性を構成する
<com.example.testbedandroid.widgets.PointCaptureView
android:id="@+id/hapticView"
android:layout_width="match_parent"
android:layout_height="120dp"
app:pcv_curve_color="@color/green"/>
これで完了です。しかし、問題も発生しました:コンパイル エラー: 未解決の参照: スタイル化可能。何が起きてる?GitHub の他の例を参照したところ、何も問題はありませんでした。困惑...
気にしないでください!警告メッセージに注意してください: Don't include `android.R` here; use a fully qualified name for each usage instead , それが問題です! コードを書く過程で解決できないシンボルに遭遇した場合、Alt + Enter を押すのはスムーズすぎます。解決のソースが複数ある場合、うっかりミスを犯してしまいます。例に戻ると、この R はandroid.Rではなく{your package name}.Rとして解析され、ソース ファイルの先頭にある import android.R をすばやく削除してから、コンストラクターのコンパイル エラーで Alt + Enter をもう一度押します。 、オイラー〜