Yanıtlar:
Genellikle stilleri programla değiştiremezsiniz; temaları veya stilleri kullanarak XML mizanpajınızdaki bir ekranın veya bir mizanpajın bir kısmının veya tek bir düğmenin görünümünü ayarlayabilirsiniz . Ancak temalar programlı olarak uygulanabilir .
Odaklanmış, seçili, basılı, devre dışı bırakılmış, vb. StateListDrawableOlabileceğiniz her durum için farklı çekilebilir öğeler tanımlamanıza izin veren a gibi bir şey de vardır Button.
Örneğin, düğmenize basıldığında renginin değişmesini sağlamak için, res/drawable/my_button.xmldizin adında bir XML dosyası şu şekilde tanımlayabilirsiniz :
<?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>
Daha sonra Buttonözelliği ayarlayarak bu seçiciyi a'ya uygulayabilirsiniz android:background="@drawable/my_button".
styleözelliğini değiştiremezsiniz , ancak Buttonyeterli olacaksa, başka herhangi bir görünümde yapabileceğiniz gibi bir arka planını programlı olarak ayarlayabilirsiniz . Ayrıca, bir Buttonöğeden miras alırken TextViewmetin özelliklerini değiştirebilirsiniz. Şu öğeler için API belgelerine bakın ... developer.android.com/reference/android/view/…
Her şeyden önce, basit bir Düğme oluşturmak için bir düzen şişirici kullanmanıza gerek yoktur. Sadece kullanabilirsiniz:
button = new Button(context);
Düğmeyi biçimlendirmek istiyorsanız 2 seçeneğiniz vardır: en basit olanı, diğer yanıtların çoğunun önerdiği gibi, koddaki tüm öğeleri belirtmektir:
button.setTextColor(Color.RED);
button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
Diğer seçenek, stili XML'de tanımlamak ve düğmeye uygulamaktır. Genel durumda, bunun ContextThemeWrapperiçin a kullanabilirsiniz :
ContextThemeWrapper newContext = new ContextThemeWrapper(baseContext, R.style.MyStyle);
button = new Button(newContext);
Bir TextView (veya Button gibi alt sınıfları) üzerindeki metinle ilgili nitelikleri değiştirmek için özel bir yöntem vardır:
button.setTextAppearance(context, R.style.MyTextStyle);
Bu sonuncusu tüm öznitelikleri değiştirmek için kullanılamaz; örneğin dolguyu değiştirmek için bir ContextThemeWrapper. Ancak metin rengi, boyutu vb setTextAppearance. İçin kullanabilirsiniz .
Evet, örneğin bir düğmede kullanabilirsiniz
Button b = new Button(this);
b.setBackgroundResource(R.drawable.selector_test);
Şu şekilde stil nitelikleri yapabilirsiniz:
Button myButton = new Button(this, null,android.R.attr.buttonBarButtonStyle);
yerine:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn"
style="?android:attr/buttonBarButtonStyle"
/>
Destek kütüphanesini kullanıyorsanız, basitçe kullanabilirsiniz
TextViewCompat.setTextAppearance(textView, R.style.AppTheme_TextStyle_ButtonDefault_Whatever);
Metin Görünümleri ve Düğmeler için. Görünümlerin geri kalanı için benzer sınıflar var :-)
Materyal cevabı arayanlar için bu SO gönderisine bakın: Android'de Materyal Tasarımı ve AppCompat ile Boyama Düğmeleri
Düğmem için varsayılan metin rengini beyaza ayarlamak için bu cevabın bir kombinasyonunu kullandım: https://stackoverflow.com/a/32238489/3075340
Ardından , arka plan rengini programlı olarak ayarlamak için bu cevabı https://stackoverflow.com/a/34355919/3075340 . Bunun kodu:
ViewCompat.setBackgroundTintList(your_colored_button,
ContextCompat.getColorStateList(getContext(),R.color.your_custom_color));
your_colored_buttonButtonİsterseniz sadece normal veya bir AppCompat düğmesi olabilir - Yukarıdaki kodu her iki tür düğme ile test ettim ve çalışıyor.
DÜZENLEME: Lolipop öncesi cihazların yukarıdaki kodla çalışmadığını buldum. Lolipop öncesi cihazlar için desteğin nasıl ekleneceğini öğrenmek için şu gönderiye bakın: https://stackoverflow.com/a/30277424/3075340
Temel olarak şunu yapın:
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);
}
Hangi stil niteliklerini değiştirmek istediğinize bağlı olarak, Paris kitaplığını kullanabilirsiniz:
Button view = (Button) LayoutInflater.from(this).inflate(R.layout.section_button, null);
Paris.style(view).apply(R.style.YourStyle);
Arka plan, padding, textSize, textColor vb. Gibi birçok özellik desteklenir.
Feragatname: Kitaplığı ben yazdım.
@Dayerman ve @h_rules tarafından verilen cevap doğru. Kodla ayrıntılı bir örnek vermek için, Çekilebilir klasörde button_disabled.xml adlı bir xml dosyası oluşturun
<?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>
Sonra Java'da
((Button) findViewById(R.id.my_button)).setEnabled(false);
((Button) findViewById(R.id.my_button)).setBackgroundResource(R.drawable.button_disabled);
Bu, düğmenin özelliğini devre dışı bırakacak ve rengi gümüşe ayarlayacaktır.
[Renk, color.xml'de şu şekilde tanımlanır:
<resources>
<color name="silver">#C0C0C0</color>
</resources>
Çalışma zamanında, düğmenizin hangi stile sahip olmasını istediğinizi bilirsiniz. Bu yüzden önceden, layout klasöründeki xml'de, ihtiyacınız olan stillere sahip tüm hazır düğmelere sahip olabilirsiniz. Yani düzen klasöründe, button_style_1.xml adında bir dosyanız olabilir. Bu dosyanın içeriği şöyle görünebilir:
<?xml version="1.0" encoding="utf-8"?>
<Button
android:id="@+id/styleOneButton"
style="@style/FirstStyle" />
Parçalarla çalışıyorsanız, onCreateView'da bu düğmeyi şu şekilde şişirirsiniz:
Button firstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);
konteyner, parçanızı oluştururken geçersiz kıldığınız onCreateView yöntemiyle ilişkili ViewGroup kapsayıcısıdır.
Böyle iki düğmeye daha mı ihtiyacınız var? Onları şöyle yaratırsınız:
Button secondFirstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);
Button thirdFirstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);
Bu düğmeleri özelleştirebilirsiniz:
secondFirstStyleBtn.setText("My Second");
thirdFirstStyleBtn.setText("My Third");
Ardından, özelleştirilmiş, stilize edilmiş düğmelerinizi onCreateView yönteminde de şişirdiğiniz düzen kapsayıcısına eklersiniz:
_stylizedButtonsContainer = (LinearLayout) rootView.findViewById(R.id.stylizedButtonsContainer);
_stylizedButtonsContainer.addView(firstStyleBtn);
_stylizedButtonsContainer.addView(secondFirstStyleBtn);
_stylizedButtonsContainer.addView(thirdFirstStyleBtn);
Ve bu, stilize düğmelerle dinamik olarak nasıl çalışabilirsiniz.
Tutucu modelini kullanarak bunun için yardımcı bir arayüz yaptım.
public interface StyleHolder<V extends View> {
void applyStyle(V view);
}
Şimdi pragmatik olarak kullanmak istediğiniz her stil için sadece arayüzü uygulayın, örneğin:
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);
}
}
Kendi tarzınızda bir stil beyan edin attrs.xml, bu örnek için stil verilebilir:
<declare-styleable name="ButtonStyleHolder">
<attr name="android:background" />
<attr name="android:textSize" />
<attr name="android:textColor" />
</declare-styleable>
İşte beyan edilen stil 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>
Ve son olarak stil tutucunun uygulanması:
Button btn = new Button(context);
StyleHolder<Button> styleHolder = new ButtonStyleHolder(context);
styleHolder.applyStyle(btn);
Bunu çok yararlı buldum, çünkü kolayca yeniden kullanılabilir ve kodu temiz ve ayrıntılı tutar, bunu yalnızca yerel bir değişken olarak kullanmanızı tavsiye ederim, böylece çöp toplayıcının tüm stilleri ayarlamayı bitirdiğimizde işini yapmasına izin verebiliriz. .
Geçenlerde aynı problemle karşılaştım. işte nasıl çözdüm.
<?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>
Teşekkürler !