これは、ビュー内でAndroidの奨励されたパターンと関係があります。これは、あなたがしようとしているように見えるための意図されたアプローチではありません。最初に、このメカニズムが何のためにあるのかを説明し、あなたのアプリのアプローチを提案します。
attrリソースを受け取るViewコンストラクタの3番目の引数は、Viewサブクラスを実装するときに一般的に使用され、表示されているように、Viewのデフォルトスタイルへの参照として使用するテーマ属性を指定できます。 AndroidのLayoutInflater
はそれが引数(Context, AttributeSet)
と2引数のコンストラクタを使用してビューを膨張させるとき
public class AwesomeButton extends Button {
public AwesomeButton(Context context) {
this(context, null);
}
public AwesomeButton(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.awesomeButtonStyle);
}
public AwesomeButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr) {
final TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.AwesomeButton, defStyleAttr, 0);
// Read AwesomeButton-specific style attributes from a
a.recycle();
}
// More code
}
:あなたはAwesomeButtonと呼ばれるボタンの特別な種類を持っていた場合は、このようなそのコンストラクタを実装するかもしれません。 R.attr定数は、3引数のバージョンに渡され、super
呼び出しでは、Button
の3引数のコンストラクタに渡されます。これは、Button
が、あなたのテーマに指定されたAwesomeButton
のデフォルトスタイルからカプセル化するもののデフォルトのスタイリング情報を読み込むことを意味します。 Androidの一部のビューは、使用するデフォルトスタイルでのみスーパークラスと異なります。 (Button
は実際にはこれらのいずれかです)
あなたのスタイルでandroid:layout_width
とandroid:layout_height
を指定しますが、これは問題になります。 LayoutParams
(すべての属性がlayout_
で始まる)は、親ビューに固有のものであり、表示されるビューではありません。これは、第2のパラメータとして意図された親ビューを常にLayoutInflater#inflate
に渡す理由です。インフレータにどのクラスがLayoutParams
の解釈を担当するべきかを伝えます。これをスキップすると、多くの場合、LayoutParams
が期待どおりに動作せず、完全に無視されることがよくあります。慣例によっては、特別な場合には作品を並べ替えても、LayoutParams
はスタイルに入れません。
スタイルをテンプレートのように使用しようとしているようです。これにレイアウトリソースを使用せず、そこにスタイリングを指定しない理由はありますか?
final LayoutInflater inflater = LayoutInflater.from(mActivity);
Button btn = (Button) inflater.inflate(R.layout.styled_button, parentView, false);
res/layout/styled_button。XML:それはAndroidのシステムリソースにどのように機能するかを説明するための
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/my_button_background"
[...] />
おかげで、それは私が自分の質問(http://stackoverflow.com/questions/11023335/how-to-set-android-button-backgroundに答える助けました-color/11024343#11024343) – Qwertie