Android カスタム コントロールのカスタム プロパティを実現するための 3 つの手順と、奇妙なエラー Unresolved reference: styleable

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 をもう一度押します。 、オイラー〜

おすすめ

転載: blog.csdn.net/happydeer/article/details/126687317