私は次のコードでXMLからビューを取得しています:
Button view = (Button) LayoutInflater.from(this).inflate(R.layout.section_button, null);
使用するボタンごとにいくつかのスタイルを使用したいので、ボタンの「スタイル」をJavaでどのように設定できますか。
通常、プログラムでスタイルを変更することはできません。 テーマまたはスタイル を使用して、画面の外観、レイアウトの一部、またはXMLレイアウトの個々のボタンを設定できます。ただし、テーマは プログラムで適用 にすることができます。
StateListDrawable
のようなものもあります。これにより、Button
が存在する可能性のある状態ごとに、フォーカス、選択、押下、無効などのさまざまなドロウアブルを定義できます。
たとえば、ボタンが押されたときにボタンの色を変更するには、次のようにres/drawable/my_button.xml
ディレクトリと呼ばれるXMLファイルを定義できます。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item
Android:state_pressed="true"
Android:drawable="@drawable/btn_pressed" />
<item
Android:state_pressed="false"
Android:drawable="@drawable/btn_normal" />
</selector>
プロパティAndroid:background="@drawable/my_button"
を設定することにより、このセレクターをButton
に適用できます。
まず、レイアウトインフレータを使用して単純なボタンを作成する必要はありません。あなただけを使用することができます:
button = new Button(context);
ボタンのスタイルを設定する場合、2つの選択肢があります。最も簡単な方法は、他の多くの回答が示唆するように、コード内のすべての要素を指定することです。
button.setTextColor(Color.RED);
button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
もう1つのオプションは、スタイルをXMLで定義し、それをボタンに適用することです。一般的な場合、このために ContextThemeWrapper
を使用できます。
ContextThemeWrapper newContext = new ContextThemeWrapper(baseContext, R.style.MyStyle);
button = new Button(newContext);
TextView(またはButtonなどのサブクラス)のテキスト関連の属性を変更するには、特別なメソッドがあります。
button.setTextAppearance(context, R.style.MyTextStyle);
この最後のものを使用してすべての属性を変更することはできません。たとえば、パディングを変更するには、ContextThemeWrapper
を使用する必要があります。しかし、テキストの色、サイズなどには、 setTextAppearance
を使用できます。
はい、たとえばボタンで使用できます
Button b = new Button(this);
b.setBackgroundResource(R.drawable.selector_test);
次のようなスタイル属性を実行できます。
Button myButton = new Button(this, null,Android.R.attr.buttonBarButtonStyle);
代わりに:
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/btn"
style="?android:attr/buttonBarButtonStyle"
/>
サポートライブラリを使用している場合は、単に使用できます
TextViewCompat.setTextAppearance(getContext(), R.style.AppTheme_TextStyle_ButtonDefault_Whatever);
textViewsおよびボタン用。他のビューにも同様のクラスがあります:-)
マテリアルの回答をお探しの方は、このSO投稿を参照してください: マテリアルデザインとAppCompat を使用したAndroidのボタンのカラーリング
この回答の組み合わせを使用して、ボタンのデフォルトのテキストの色をボタンの白に設定しました: https://stackoverflow.com/a/32238489/3075340
次に、この答え https://stackoverflow.com/a/34355919/3075340 により、背景色をプログラムで設定します。そのためのコードは次のとおりです。
ViewCompat.setBackgroundTintList(your_colored_button,
ContextCompat.getColorStateList(getContext(),R.color.your_custom_color));
your_colored_button
は、通常のButton
または必要に応じてAppCompatボタンにすることができます。上記のコードを両方のタイプのボタンでテストし、機能します。
編集:ロリポップ以前のデバイスは上記のコードでは動作しないことがわかりました。 Lollipop以前のデバイスのサポートを追加する方法については、この投稿を参照してください: https://stackoverflow.com/a/30277424/3075340
基本的にこれを行います:
Button b = (Button) findViewById(R.id.button);
ColorStateList c = ContextCompat.getColorStateList(mContext, R.color.your_custom_color;
Drawable d = b.getBackground();
if (b instanceof AppCompatButton) {
// appcompat button replaces tint of its drawable background
((AppCompatButton)b).setSupportBackgroundTintList(c);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
// Lollipop button replaces tint of its drawable background
// however it is not equal to d.setTintList(c)
b.setBackgroundTintList(c);
} else {
// this should only happen if
// * manually creating a Button instead of AppCompatButton
// * LayoutInflater did not translate a Button to AppCompatButton
d = DrawableCompat.wrap(d);
DrawableCompat.setTintList(d, c);
b.setBackgroundDrawable(d);
}
@Dayermanと@h_rulesによる答えは正しい。コードを使用して詳細な例を示すには、drawableフォルダーにbutton_disabled.xmlというxmlファイルを作成します
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle" Android:padding="10dp">
<solid Android:color="@color/silver"/>
<corners
Android:bottomRightRadius="20dp"
Android:bottomLeftRadius="20dp"
Android:topLeftRadius="20dp"
Android:topRightRadius="20dp"/>
</shape>
次に、Javaで、
((Button) findViewById(R.id.my_button)).setEnabled(false);
((Button) findViewById(R.id.my_button)).setBackgroundResource(R.drawable.button_disabled);
これにより、ボタンのプロパティが無効に設定され、色が銀色に設定されます。
[色は、color.xmlで次のように定義されています。
<resources>
<color name="silver">#C0C0C0</color>
</resources>
変更するスタイル属性に応じて、パリライブラリを使用できる場合があります。
Button view = (Button) LayoutInflater.from(this).inflate(R.layout.section_button, null);
Paris.style(view).apply(R.style.YourStyle);
背景、パディング、textSize、textColorなどの多くの属性がサポートされています。
免責事項:ライブラリを作成しました。
実行時に、ボタンにどのスタイルを追加するかを知っています。そのため、事前にレイアウトフォルダーのxmlに、必要なスタイルのボタンをすべて用意することができます。したがって、レイアウトフォルダーには、button_style_1.xmlという名前のファイルがあります。そのファイルの内容は次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<Button
Android:id="@+id/styleOneButton"
style="@style/FirstStyle" />
フラグメントを操作している場合、onCreateViewで次のようにそのボタンを膨らませます。
Button firstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);
containerは、フラグメントの作成時にオーバーライドするonCreateViewメソッドに関連付けられたViewGroupコンテナーです。
さらに2つのボタンが必要ですか?次のように作成します。
Button secondFirstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);
Button thirdFirstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);
これらのボタンをカスタマイズできます。
secondFirstStyleBtn.setText("My Second");
thirdFirstStyleBtn.setText("My Third");
次に、onCreateViewメソッドで膨らませたレイアウトコンテナに、カスタマイズされた様式化されたボタンを追加します。
_stylizedButtonsContainer = (LinearLayout) rootView.findViewById(R.id.stylizedButtonsContainer);
_stylizedButtonsContainer.addView(firstStyleBtn);
_stylizedButtonsContainer.addView(secondFirstStyleBtn);
_stylizedButtonsContainer.addView(thirdFirstStyleBtn);
そして、それが様式化されたボタンを動的に操作する方法です。
私は最近同じ問題に直面しました。ここに私がそれを解決した方法があります。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<!-- This is the special two colors background START , after this LinearLayout, you can add all view that have it for main background-->
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:weightSum="2"
Android:background="#FFFFFF"
Android:orientation="horizontal"
>
<View
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_weight="1"
Android:background="#0000FF" />
<View
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_weight="1"
Android:background="#F000F0" />
</LinearLayout>
<!-- This is the special two colors background END-->
<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_centerInParent="true"
Android:gravity="center"
Android:text="This Text is centered with a special backgound,
You can add as much elements as you want as child of this RelativeLayout"
Android:textColor="#FFFFFF"
Android:textSize="20sp" />
</RelativeLayout>
ありがとう!
ホルダーパターンを使用して、このためのヘルパーインターフェイスを作成しました。
public interface StyleHolder<V extends View> {
void applyStyle(V view);
}
これで、実用的に使用したいすべてのスタイルに対して、インターフェースを実装するだけです。例えば:
public class ButtonStyleHolder implements StyleHolder<Button> {
private final Drawable background;
private final ColorStateList textColor;
private final int textSize;
public ButtonStyleHolder(Context context) {
TypedArray ta = context.obtainStyledAttributes(R.style.button, R.styleable.ButtonStyleHolder);
Resources resources = context.getResources();
background = ta.getDrawable(ta.getIndex(R.styleable.ButtonStyleHolder_Android_background));
textColor = ta.getColorStateList(ta.getIndex(R.styleable.ButtonStyleHolder_Android_textColor));
textSize = ta.getDimensionPixelSize(
ta.getIndex(R.styleable.ButtonStyleHolder_Android_textSize),
resources.getDimensionPixelSize(R.dimen.standard_text_size)
);
// Don't forget to recycle!
ta.recycle();
}
@Override
public void applyStyle(Button btn) {
btn.setBackground(background);
btn.setTextColor(textColor);
btn.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
}
}
attrs.xml
でスタイル設定可能を宣言します。この例のスタイル設定は次のとおりです。
<declare-styleable name="ButtonStyleHolder">
<attr name="Android:background" />
<attr name="Android:textSize" />
<attr name="Android:textColor" />
</declare-styleable>
styles.xml
で宣言されているスタイルは次のとおりです。
<style name="button">
<item name="Android:background">@drawable/button</item>
<item name="Android:textColor">@color/light_text_color</item>
<item name="Android:textSize">@dimen/standard_text_size</item>
</style>
そして最後に、スタイルホルダーの実装:
Button btn = new Button(context);
StyleHolder<Button> styleHolder = new ButtonStyleHolder(context);
styleHolder.applyStyle(btn);
これは簡単に再利用でき、コードを簡潔かつ冗長に保つことができるため、これが非常に役立つことがわかりました。 。