Ich versuche, einen benutzerdefinierten Button-Hintergrund auf meine gesamte Anwendung anzuwenden, aber es scheint nur zu funktionieren, wenn ich es programmgesteuert mache.Programmatisch-aufgeblähter Button akzeptiert XML-Format nicht
Hier ist styles.xml. Ich benutze <item name="android:buttonStyle">@style/OverlayButton</item>
, um den benutzerdefinierten Stil "OverlayButton" anzugeben (übrigens, <item name="buttonStyle">@style/OverlayButton</item>
gibt "Keine Ressource gefunden, die den angegebenen Namen entspricht: attr 'buttonStyle'.") Und dann <item name="android:background">@drawable/overlay_button</item>
, um die benutzerdefinierte Drawable
aufzurufen.
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<!--
Base application theme, dependent on API level. This theme is replaced
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Light">
<!--
Theme customizations available in newer API levels can go in
res/values-vXX/styles.xml, while customizations related to
backward-compatibility can go here.
-->
</style>
<!-- Application theme -->
<style name="AppTheme" parent="AppBaseTheme">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
<!-- http://stackoverflow.com/questions/6159113/android-where-is-the-spinner-widgets-text-color-attribute-hiding -->
<item name="android:spinnerItemStyle">@style/SpinnerItem</item>
<item name="android:spinnerDropDownItemStyle">@style/SpinnerItem.DropDownItem</item>
<!-- http://stackoverflow.com/questions/8922924/how-to-change-android-spinner-popupbackground -->
<!-- http://www.ezzylearning.com/tutorial.aspx?tid=1763429 -->
<item name="android:listViewStyle">@style/myListView</item>
<item name="android:buttonStyle">@style/OverlayButton</item>
</style>
<style name="SpinnerItem" parent="@android:style/Widget.TextView.SpinnerItem">
<item name="android:textColor">#ADD8E6</item>
</style>
<style name="SpinnerItem.DropDownItem" parent="@android:style/Widget.DropDownItem.Spinner">
<item name="android:textColor">#ADD8E6</item>
</style>
<style name="myListView" parent="@android:style/Widget.ListView">
<item name="android:background">@drawable/intro_spinner</item>
</style>
<!-- Style for Overlay Buttons -->
<style name="OverlayButton" parent="@android:style/Widget.Button">
<item name="android:background">@drawable/overlay_button</item>
<item name="android:gravity">center_vertical|center_horizontal</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textSize">12sp</item>
<item name="android:textColor">#FF000000</item>
<item name="android:layout_marginLeft">0dp</item>
<item name="android:layout_marginRight">0dp</item>
<item name="android:layout_marginTop">10dp</item>
<item name="android:layout_marginBottom">10dp</item>
</style>
<!-- Style for Confirmation Dialog -->
<style name="AlertDialogCustom" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:background">@drawable/dialog_background</item>
<item name="android:textColor">#FF000000</item>
<item name="android:textSize">12sp</item>
<item name="android:typeface">monospace</item>
</style>
</resources>
Der Brauch Drawable, overlay_button.xml, ist hier.
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >
<shape>
<gradient
android:startColor="#999999"
android:endColor="#c0c0c0"
android:angle="270" />
<stroke
android:width="3dp"
android:color="#202619" />
<corners
android:radius="3dp" />
<padding
android:left="1dp"
android:top="1dp"
android:right="1dp"
android:bottom="1dp" />
<margin
android:left="5dp"
android:top="5dp"
android:right="5dp"
android:bottom="5dp" />
</shape>
</item>
<item android:state_focused="true" >
<shape>
<gradient
android:endColor="#999999"
android:startColor="#c0c0c0"
android:angle="270" />
<stroke
android:width="3dp"
android:color="#202619" />
<corners
android:radius="3dp" />
<padding
android:left="1dp"
android:top="1dp"
android:right="1dp"
android:bottom="1dp" />
<margin
android:left="5dp"
android:top="5dp"
android:right="5dp"
android:bottom="5dp" />
</shape>
</item>
<item>
<shape>
<gradient
android:endColor="#aa393939"
android:startColor="#aa737373"
android:angle="270" />
<stroke
android:width="3dp"
android:color="#202619" />
<corners
android:radius="3dp" />
<padding
android:left="1dp"
android:top="1dp"
android:right="1dp"
android:bottom="1dp" />
<margin
android:left="5dp"
android:top="5dp"
android:right="5dp"
android:bottom="5dp" />
</shape>
</item>
</selector>
Wenn ich einen Button mit final Button b = new Button(context);
erstellen Ich habe nicht die Gewohnheit Drawable. Dies funktioniert jedoch:
Warum sollte dies programmatisch aber nicht im XML funktionieren?
Update: @ r-Zagorski hatte einen guten Anhaltspunkt. Die XML-aufgeblähten Schaltflächen übernehmen den benutzerdefinierten Stil und funktionieren wie erwartet. Die Schaltflächen, die nicht funktionieren, werden programmgesteuert erstellt und über LinearLayout.addView(b)
eingefügt. (Übrigens funktioniert final Button b = new Button(context, null, R.drawable.overlay_button_selector)
nicht.) Ich sehe nicht, warum das nicht funktioniert wie die XML-aufgeblähten Schaltflächen.
Vielen Dank, aber ich implementiert genau das, was Sie gesagt haben, und es hat nicht funktioniert. Ich hatte zuvor die [Seite] (https://developer.android.com/guide/topics/ui/controls/button) gelesen.html # CustomBackground), auf die Sie verwiesen haben, aber ich habe unzählige andere Beispiele des "All-in-One" Selektors gesehen. Unabhängig davon habe ich das Drawable in drei Zustände aufgeteilt und sie an einen Selektor gebunden, genau wie du es getan hast, und es hatte keinen Einfluss auf das Verhalten. –
Bitte, überprüfen Sie es erneut, wie ich diesen Code ohne Probleme ausführen (Button ändert den Zustand beim Klicken). Getestet auf Android Emulator API 23. –
Es muss ein Problem an anderer Stelle sein. Ich habe die App neu erstellt und erneut ausgeführt - keine Änderung. Wenn ich "b.setBackground (buttonStates)" auskommentiere, dann bekomme ich die "Standard" -Schaltfläche. Wenn ich es belasse, bekomme ich den benutzerdefinierten 'overlay_selector'. Die anderen Dinge, die ich neben 'b.setOnClickListener()' an den 'Button' mache, sind' b.setTag() 'und' b.setTransformationMethod (null) '. Keine davon hat Auswirkungen. Ich habe keine Ideen. –