web-dev-qa-db-ja.com

カスタムコンポーネントのカスタム属性をプログラムで設定するにはどうすればよいですか?

CircleViewというカスタムコンポーネントがあり、_attrs.xml_で定義されているfillColorというカスタム属性を変更したい:

_<declare-styleable name="CircleView">
    <attr name="radius" format="integer" />
    <attr name="fillColor" format="color" />
</declare-styleable>
_

最初にレイアウトXMLで設定しましたが、現在は次のようになっています(名前空間circleviewは_xmlns:circleview="http://schemas.Android.com/apk/res-auto"_として定義されています。XMLで定義すると正常に機能するため、これは問題):

_<com.mz496.toolkit.CircleView
     ...
     circleview:fillColor="#33ffffff"/>
_

fillColorを拡張するCircleViewView属性を問題なく取得できますが、その値を設定する方法がわかりません。

setBackgroundColorのようなものを調査し、他の「set」メソッドを探しましたが、見つかりませんでした。私は次のような方法を想像しました

circle.setAttribute(R.styleable.CircleView_fillColor, "#33ff0000")

13
mz496

レイアウト内のCircleViewCircleViewクラスのインスタンスにすぎないため、_CircleView.Java_に関数を追加するだけです。

_public void setFillColor(int newColor) {
    fillColor = newColor;
}
_

そして、必要なときにいつでもそれを呼び出します:

_CircleView circle_view = (CircleView) findViewById(R.id.circle_view);
circle_view.setFillColor(0x33ffffff);
circle_view.invalidate();
_

また、これは内部変数を変更するだけですが、カスタムコンポーネントは全体が自動的に再描画される場合にのみ自動的に再描画されるため、Viewクラスのinvalidate()メソッドを使用してカスタムコンポーネントを再描画する必要があることにも注意してください。ビューが再描画されます。例:フラグメントを切り替えるとき(参照: ビューにそれ自体を再描画させる )。

(これは、「これを自分で定義する必要がありますか?」と尋ねようとしたときに最後に理解し、自分で定義してみましたが、うまくいきました。)

6
mz496