Câu trả lời:
Nói chung, bạn không thể thay đổi kiểu theo chương trình; bạn có thể đặt giao diện của màn hình hoặc một phần của bố cục, hoặc từng nút trong bố cục XML của mình bằng cách sử dụng các chủ đề hoặc kiểu . Tuy nhiên, chủ đề có thể được áp dụng theo chương trình .
Ngoài ra còn có một thứ như StateListDrawable
cho phép bạn xác định các ngăn kéo khác nhau cho từng trạng thái mà bạn Button
có thể ở, cho dù được lấy nét, chọn, nhấn, tắt, v.v.
Ví dụ: để nút của bạn thay đổi màu khi nó được nhấn, bạn có thể xác định một tệp XML có tên là res/drawable/my_button.xml
thư mục như sau:
<?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>
Sau đó, bạn có thể áp dụng bộ chọn này cho một Button
bằng cách đặt thuộc tính android:background="@drawable/my_button"
.
style
thuộc tính Android , nhưng bạn có thể lập trình nền của một Button
cái giống như bạn có thể làm với bất kỳ chế độ xem nào khác, nếu điều đó là đủ. Ngoài ra, là một Button
kế thừa từ TextView
, bạn có thể thay đổi các thuộc tính văn bản. Chỉ cần xem tài liệu API cho các mục này ... developer.android.com/reference/android/view/…
Trước hết, bạn không cần phải sử dụng một bộ thổi phồng bố cục để tạo một Nút đơn giản. Bạn chỉ có thể sử dụng:
button = new Button(context);
Nếu bạn muốn tạo kiểu cho nút, bạn có 2 lựa chọn: cách đơn giản nhất là chỉ cần chỉ định tất cả các phần tử trong mã, giống như nhiều câu trả lời khác đề xuất:
button.setTextColor(Color.RED);
button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
Tùy chọn khác là xác định kiểu trong XML và áp dụng nó vào nút. Trong trường hợp chung, bạn có thể sử dụng một ContextThemeWrapper
cho điều này:
ContextThemeWrapper newContext = new ContextThemeWrapper(baseContext, R.style.MyStyle);
button = new Button(newContext);
Để thay đổi các thuộc tính liên quan đến văn bản trên TextView (hoặc các lớp con của nó như Nút), có một phương pháp đặc biệt:
button.setTextAppearance(context, R.style.MyTextStyle);
Cái cuối cùng này không thể được sử dụng để thay đổi tất cả các thuộc tính; ví dụ để thay đổi đệm bạn cần sử dụng a ContextThemeWrapper
. Nhưng đối với màu văn bản, kích thước, vv bạn có thể sử dụng setTextAppearance
.
Có, bạn có thể sử dụng ví dụ như trong một nút
Button b = new Button(this);
b.setBackgroundResource(R.drawable.selector_test);
Bạn có thể thực hiện các thuộc tính kiểu như sau:
Button myButton = new Button(this, null,android.R.attr.buttonBarButtonStyle);
thay cho:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn"
style="?android:attr/buttonBarButtonStyle"
/>
Nếu bạn đang sử dụng thư viện Hỗ trợ, bạn chỉ cần sử dụng
TextViewCompat.setTextAppearance(textView, R.style.AppTheme_TextStyle_ButtonDefault_Whatever);
cho TextViews và Buttons. Có các lớp tương tự cho phần còn lại của Chế độ xem :-)
Đối với bất kỳ ai đang tìm kiếm câu trả lời Material, hãy xem bài đăng SO này: Các nút màu trong Android với Material Design và AppCompat
Tôi đã sử dụng kết hợp câu trả lời này để đặt màu văn bản mặc định của nút thành màu trắng cho nút của mình: https://stackoverflow.com/a/32238489/3075340
Sau đó, câu trả lời này https://stackoverflow.com/a/34355919/3075340 để đặt màu nền theo chương trình. Mã cho điều đó là:
ViewCompat.setBackgroundTintList(your_colored_button,
ContextCompat.getColorStateList(getContext(),R.color.your_custom_color));
your_colored_button
có thể chỉ là Button
một nút thông thường hoặc một nút AppCompat nếu bạn muốn - Tôi đã thử nghiệm đoạn mã trên với cả hai loại nút và nó hoạt động.
CHỈNH SỬA: Tôi thấy rằng các thiết bị tiền kẹo mút không hoạt động với mã trên. Xem bài đăng này về cách thêm hỗ trợ cho các thiết bị tiền kẹo mút: https://stackoverflow.com/a/30277424/3075340
Về cơ bản làm điều này:
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);
}
Tùy thuộc vào thuộc tính kiểu nào bạn muốn thay đổi, bạn có thể sử dụng thư viện Paris:
Button view = (Button) LayoutInflater.from(this).inflate(R.layout.section_button, null);
Paris.style(view).apply(R.style.YourStyle);
Nhiều thuộc tính như background, padding, textSize, textColor, v.v. được hỗ trợ.
Tuyên bố từ chối trách nhiệm: Tôi là tác giả của thư viện.
Câu trả lời của @Dayerman và @h_rules là đúng. Để đưa ra một ví dụ chi tiết với mã, Trong thư mục có thể vẽ, hãy tạo tệp xml có tên button_disabled.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>
Sau đó, trong Java,
((Button) findViewById(R.id.my_button)).setEnabled(false);
((Button) findViewById(R.id.my_button)).setBackgroundResource(R.drawable.button_disabled);
Thao tác này sẽ đặt thuộc tính của nút thành vô hiệu hóa và đặt màu thành bạc.
[Màu được định nghĩa trong color.xml là:
<resources>
<color name="silver">#C0C0C0</color>
</resources>
Trong thời gian chạy, bạn biết bạn muốn nút của mình có kiểu dáng nào. Vì vậy, trước đó, trong xml trong thư mục bố cục, bạn có thể có tất cả các nút sẵn sàng để bắt đầu với các kiểu bạn cần. Vì vậy, trong thư mục bố cục, bạn có thể có một tệp có tên: button_style_1.xml. Nội dung của tệp đó có thể giống như sau:
<?xml version="1.0" encoding="utf-8"?>
<Button
android:id="@+id/styleOneButton"
style="@style/FirstStyle" />
Nếu bạn đang làm việc với các phân đoạn, thì trong onCreateView, bạn tăng cường nút đó, như:
Button firstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);
trong đó vùng chứa là vùng chứa ViewGroup được liên kết với phương thức onCreateView mà bạn ghi đè khi tạo phân đoạn của mình.
Cần thêm hai nút như vậy? Bạn tạo chúng như thế này:
Button secondFirstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);
Button thirdFirstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);
Bạn có thể tùy chỉnh các nút đó:
secondFirstStyleBtn.setText("My Second");
thirdFirstStyleBtn.setText("My Third");
Sau đó, bạn thêm các nút tùy chỉnh, cách điệu của mình vào vùng chứa bố cục mà bạn cũng đã tăng trong phương thức onCreateView:
_stylizedButtonsContainer = (LinearLayout) rootView.findViewById(R.id.stylizedButtonsContainer);
_stylizedButtonsContainer.addView(firstStyleBtn);
_stylizedButtonsContainer.addView(secondFirstStyleBtn);
_stylizedButtonsContainer.addView(thirdFirstStyleBtn);
Và đó là cách bạn có thể làm việc linh hoạt với các nút cách điệu.
Tôi đã tạo giao diện trợ giúp cho việc này bằng cách sử dụng mẫu chủ.
public interface StyleHolder<V extends View> {
void applyStyle(V view);
}
Bây giờ, đối với mọi phong cách bạn muốn sử dụng thực tế, chỉ cần triển khai giao diện, ví dụ:
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);
}
}
Khai báo một định dạng trong của bạn attrs.xml
, có thể tạo kiểu cho ví dụ này là:
<declare-styleable name="ButtonStyleHolder">
<attr name="android:background" />
<attr name="android:textSize" />
<attr name="android:textColor" />
</declare-styleable>
Đây là kiểu được khai báo trong 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>
Và cuối cùng là việc triển khai trình giữ kiểu:
Button btn = new Button(context);
StyleHolder<Button> styleHolder = new ButtonStyleHolder(context);
styleHolder.applyStyle(btn);
Tôi thấy điều này rất hữu ích vì nó có thể dễ dàng được sử dụng lại và giữ cho mã sạch sẽ và dài dòng, tôi khuyên bạn chỉ nên sử dụng biến này làm biến cục bộ để chúng tôi có thể cho phép trình thu gom rác thực hiện công việc của mình sau khi chúng tôi hoàn tất việc thiết lập tất cả các kiểu .
Tôi phải đối mặt với cùng một vấn đề gần đây. đây là cách tôi giải quyết nó.
<?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>
Cảm ơn !