So legen Sie das Stilattribut in einer Ansicht programmgesteuert fest

Ich erhalte eine Ansicht aus dem XML mit dem folgenden Code:

Button view = (Button) LayoutInflater.from(this).inflate(R.layout.section_button, null); 

Ich würde gerne einen “Stil” für die Schaltfläche festlegen, wie kann ich das in Java tun, da ich mehrere Stil für jede Schaltfläche verwenden möchte, die ich verwenden werde.

   

Im Allgemeinen können Stile nicht programmgesteuert geändert werden. Sie können das Aussehen eines Bildschirms oder eines Teils eines Layouts oder einer individuellen Schaltfläche in Ihrem XML-Layout mithilfe von Designs oder Stilen festlegen. Designs können jedoch programmgesteuert angewendet werden .

Es gibt auch so etwas wie eine StateListDrawable der Sie für jeden Zustand, in dem sich Ihre StateListDrawable kann, verschiedene Zeichenvorlagen definieren können, ob fokussiert, ausgewählt, gedrückt, deaktiviert usw.

Um beispielsweise zu erreichen, dass Ihre Schaltfläche die Farbe ändert, wenn sie gedrückt wird, können Sie eine XML-Datei namens res/drawable/my_button.xml wie res/drawable/my_button.xml :

 < ?xml version="1.0" encoding="utf-8"?>     

Sie können diesen Selektor dann auf einen Button anwenden, indem Sie die Eigenschaft android:background="@drawable/my_button" .

Zunächst müssen Sie keinen Layout-Inflator verwenden, um einen einfachen Button zu erstellen. Sie können einfach verwenden:

 button = new Button(context); 

Wenn Sie die Schaltfläche stylen möchten, haben Sie zwei Möglichkeiten: Die einfachste ist, alle Elemente im Code anzugeben, wie viele der anderen Antworten vorschlagen:

 button.setTextColor(Color.RED); button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); 

Die andere Option besteht darin, den Stil in XML zu definieren und auf die Schaltfläche anzuwenden. Im Allgemeinen können Sie hierfür einen ContextThemeWrapper :

 ContextThemeWrapper newContext = new ContextThemeWrapper(baseContext, R.style.MyStyle); button = new Button(newContext); 

Um die textbezogenen Attribute eines TextView (oder seiner Unterklassen wie Button) zu ändern gibt es eine spezielle Methode:

 button.setTextAppearance(context, R.style.MyTextStyle); 

Dieser letzte kann nicht dazu verwendet werden, alle Attribute zu ändern. ContextThemeWrapper beispielsweise das Padding zu ändern, müssen Sie einen ContextThemeWrapper . Für setTextAppearance , Größe usw. können Sie setTextAppearance .

Ja, Sie können zum Beispiel in einer Schaltfläche verwenden

 Button b = new Button(this); b.setBackgroundResource(R.drawable.selector_test); 

Für alle, die eine Material-Antwort suchen, finden Sie in diesem SO-Post: Malknöpfe in Android mit Material Design und AppCompat

Ich habe eine Kombination aus dieser Antwort verwendet, um die Standardtextfarbe der Schaltfläche für meine Schaltfläche auf weiß festzulegen: https://stackoverflow.com/a/32238489/3075340

Dann diese Antwort https://stackoverflow.com/a/34355919/3075340 , um die Hintergrundfarbe programmgesteuert einzustellen. Der Code dafür lautet:

 ViewCompat.setBackgroundTintList(your_colored_button, ContextCompat.getColorStateList(getContext(),R.color.your_custom_color)); 

your_colored_button kann nur eine normale Schaltfläche oder eine AppCompat-Schaltfläche sein, wenn Sie möchten – Ich habe den obigen Code mit beiden Arten von Schaltflächen getestet und es funktioniert.

EDIT: Ich habe festgestellt, dass Pre-Lollipop-Geräte nicht mit dem obigen Code arbeiten. In diesem Beitrag erfahren Sie, wie Sie Support für Pre-Lollipop-Geräte hinzufügen können: https://stackoverflow.com/a/30277424/3075340

Grundsätzlich mache das:

 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); } 

Die Antwort von @Dayerman und @h_rules ist richtig. Um ein ausgearbeitetes Beispiel mit Code zu geben, erstellen Sie im aufklappbaren Ordner eine XML-Datei mit dem Namen button_disabled.xml

 < ?xml version="1.0" encoding="utf-8"?>     

Dann in Java,

 ((Button) findViewById(R.id.my_button)).setEnabled(false); ((Button) findViewById(R.id.my_button)).setBackgroundResource(R.drawable.button_disabled); 

Dadurch wird die Eigenschaft der Schaltfläche deaktiviert und die Farbe wird auf Silber gesetzt.

[Die Farbe ist in color.xml wie folgt definiert:

  #C0C0C0  

Sie können Stilattribute wie folgt machen:

 Button myButton = new Button(this, null,android.R.attr.buttonBarButtonStyle); 

anstelle von:

  

Zur Laufzeit wissen Sie, welchen Stil Ihre Schaltfläche haben soll. Zuvor können Sie also in xml im Layout-Ordner alle Schaltflächen mit den benötigten Stilen verwenden. Im Layoutordner haben Sie möglicherweise eine Datei namens button_style_1.xml. Der Inhalt dieser Datei könnte folgendermaßen aussehen:

 < ?xml version="1.0" encoding="utf-8"?>  

Wenn Sie mit Fragmenten arbeiten, dann blenden Sie in onCreateView diese Schaltfläche auf, wie zum Beispiel:

 Button firstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false); 

container ist der ViewGroup-Container, der der onCreateView-Methode zugeordnet ist, die Sie beim Erstellen Ihres Fragments überschreiben.

Brauchen Sie noch zwei solche Knöpfe? Sie erstellen sie so:

 Button secondFirstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false); Button thirdFirstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false); 

Sie können diese Schaltflächen anpassen:

 secondFirstStyleBtn.setText("My Second"); thirdFirstStyleBtn.setText("My Third"); 

Dann fügen Sie Ihre angepassten, stilisierten Schaltflächen dem Layout-Container hinzu, den Sie auch in der onCreateView-Methode aufgebläht haben:

 _stylizedButtonsContainer = (LinearLayout) rootView.findViewById(R.id.stylizedButtonsContainer); _stylizedButtonsContainer.addView(firstStyleBtn); _stylizedButtonsContainer.addView(secondFirstStyleBtn); _stylizedButtonsContainer.addView(thirdFirstStyleBtn); 

Und so können Sie dynamisch mit stilisierten Buttons arbeiten.

Abhängig davon, welche Stilattribute Sie ändern möchten, können Sie möglicherweise die Paris-Bibliothek verwenden:

 Button view = (Button) LayoutInflater.from(this).inflate(R.layout.section_button, null); Paris.style(view).apply(R.style.YourStyle); 

Viele Attribute wie background, padding, textSize, textColor usw. werden unterstützt.

  • Liste der derzeit unterstützten Attribute
  • Installationsanleitung

Disclaimer: Ich habe die Bibliothek verfasst.

Wenn Sie die Support-Bibliothek verwenden, können Sie einfach verwenden

 TextViewCompat.setTextAppearance(getContext(), R.style.AppTheme_TextStyle_ButtonDefault_Whatever); 

für TextViews und Schaltflächen. Es gibt ähnliche classn für den Rest von Views 🙂

Ich hatte in letzter Zeit das gleiche Problem. hier ist, wie ich es getriggers habe.

 < ?xml version="1.0" encoding="utf-8"?>          
  • Ich habe ein LinearLayout mit Android verwendet: weightSum = “2”
  • Ich gab den beiden Kind-Elementen Android: layout_weight = “1” (ich gab jeweils 50% des Elternplatzes (width & height))
  • Und schließlich gab ich den zwei Kindelementen verschiedene Hintergrundfarben, um den endgültigen Effekt zu erzielen.

Vielen Dank !

Ich habe dafür eine Helferschnittstelle mit dem Haltermuster erstellt.

 public interface StyleHolder { void applyStyle(V view); } 

Verwenden Sie jetzt für jeden Stil, den Sie pragmatisch verwenden möchten, einfach die Schnittstelle, zum Beispiel:

 public class ButtonStyleHolder implements StyleHolder 

Deklarieren Sie in Ihrer attrs.xml ein stylable, das für dieses Beispiel styled ist:

      

Hier ist der in styles.xml deklarierte styles.xml :

  

Und schließlich die Implementierung des Stilhalters:

 Button btn = new Button(context); StyleHolder 

Ich fand das sehr hilfreich, da es leicht wiederverwendet werden kann und den Code sauber und ausführlich hält. Ich würde empfehlen, dies nur als lokale Variable zu verwenden, damit wir dem Garbage Collector erlauben können, seine Arbeit zu erledigen, sobald wir alle Stile eingestellt haben .