it-swarm.com.de

Android-Ankreuzfeldstil

Ich bin neu in Android und versuche alle Kontrollkästchen in meiner Anwendung mit einem Stil zu versehen. Mein Anwendungsstil ist auf Theme.Holo festgelegt, was dunkel ist, und ich möchte, dass die Kontrollkästchen in der Listenansicht den Stil Theme.Holo.Light haben. Ich versuche nicht, einen benutzerdefinierten Stil zu erstellen. Der folgende Code scheint nicht zu funktionieren, es passiert überhaupt nichts. Ich muss das tun, weil meine Listenansicht eine helle Papierstruktur hat und das Kontrollkästchen und der Kontrollkästchen-Text weiß sind, was ich gerne dunkel haben möchte.

<style name="CustomActivityTheme" parent="@Android:style/Theme.Holo">
    <item name="Android:checkboxStyle">@style/customCheckBoxStyle</item>
</style>

<style name="customCheckBoxStyle" parent="@Android:style/Widget.Holo.Light.CompoundButton.CheckBox">
</style>

Können Sie auch Stile für einzelne Widgets festlegen, wenn Sie der Anwendung einen Stil zuweisen?

39
user1330739

Note: Verwenden der Android Support Library v22.1.0 und Targeting-API ab Version 11? Scrollen Sie bis zum letzten Update.


Mein Anwendungsstil ist auf Theme.Holo eingestellt, was dunkel ist und ich würde wie die Kontrollkästchen in meiner Listenansicht, um den Stil Theme.Holo.Light . Ich versuche nicht, einen benutzerdefinierten Stil zu erstellen. Der folgende Code scheint nicht zur Arbeit passiert gar nichts.

Zunächst ist es vielleicht nicht klar, warum das System dieses Verhalten zeigt, aber wenn Sie tatsächlich in die Mechanik schauen, können Sie es leicht ableiten. Lassen Sie mich Schritt für Schritt durchgehen.

Schauen wir uns zuerst an, was der Widget.Holo.Light.CompoundButton.CheckBox-Stil definiert. Um die Dinge klarer zu machen, habe ich auch die Definition des 'normalen' (nicht leichten) Stils hinzugefügt.

<style name="Widget.Holo.Light.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" />

<style name="Widget.Holo.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" />

Wie Sie sehen, sind beide leere Deklarationen, die einfach Widget.CompoundButton.CheckBox in einen anderen Namen schreiben. Schauen wir uns also diesen übergeordneten Stil an.

<style name="Widget.CompoundButton.CheckBox">
    <item name="Android:background">@Android:drawable/btn_check_label_background</item>
    <item name="Android:button">?android:attr/listChoiceIndicatorMultiple</item>
</style>

Dieser Stil verweist sowohl auf einen Hintergrund als auch auf eine Schaltfläche, die gezeichnet werden kann. btn_check_label_background ist einfach ein 9er-Patch und daher in dieser Hinsicht nicht sehr interessant. ?android:attr/listChoiceIndicatorMultiple zeigt jedoch an, dass ein Attribut, das auf dem current-Theme basiert (dies ist wichtig zu erkennen), das tatsächliche Aussehen der CheckBox bestimmt.

Da listChoiceIndicatorMultiple ein Designattribut ist, werden Sie mehrere Deklarationen dafür finden - eine für jedes Design (oder keine, wenn es von einem übergeordneten Design geerbt wird). Dies sieht wie folgt aus (wobei zur Vereinfachung andere Attribute weggelassen wurden):

<style name="Theme">
    <item name="listChoiceIndicatorMultiple">@Android:drawable/btn_check</item>
    ...
</style>

<style name="Theme.Holo">
    <item name="listChoiceIndicatorMultiple">@Android:drawable/btn_check_holo_dark</item>
    ...
</style>

<style name="Theme.Holo.Light" parent="Theme.Light">
    <item name="listChoiceIndicatorMultiple">@Android:drawable/btn_check_holo_light</item>
    ...
</style>

Hier passiert also die wahre Magie: Basierend auf dem listChoiceIndicatorMultiple-Attribut des Themas wird das tatsächliche Aussehen der CheckBox bestimmt. Das Phänomen, das Sie sehen, ist nun leicht zu erklären: Da das Erscheinungsbild themenorientiert ist (und nicht - Stilstil, da dies lediglich eine leere Definition ist) und Sie von Theme.Holo erben, erhalten Sie immer das CheckBox Aussehen, das zum Design passt.

Wenn Sie nun das Erscheinungsbild Ihrer CheckBox in die Holo.Light-Version ändern möchten, müssen Sie eine Kopie dieser Ressourcen erstellen, sie Ihren lokalen Assets hinzufügen und einen benutzerdefinierten Stil verwenden, um sie anzuwenden.

Zu Ihrer zweiten Frage:

Können Sie auch Stile für einzelne Widgets festlegen, wenn Sie der Anwendung einen Stil zuweisen?

Absolut, und sie überschreiben alle Aktivitäts- oder Anwendungssatzstile.

Gibt es eine Möglichkeit, ein Design (Stil mit Bildern) auf das Kontrollkästchen .__ zu setzen. Widget. (...) Gibt es diesen Selektor überhaupt zu benutzen: link ?


Update:

Lassen Sie mich noch einmal sagen, dass Sie sich nicht auf die internen Ressourcen von Android verlassen sollten. Es gibt einen Grund, warum Sie nicht einfach auf den internen Namespace zugreifen können.

Eine Möglichkeit, auf Systemressourcen zuzugreifen, ist jedoch die Suche nach Namen. Betrachten Sie den folgenden Codeausschnitt:

int id = Resources.getSystem().getIdentifier("btn_check_holo_light", "drawable", "Android");
((CheckBox) findViewById(R.id.checkbox)).setButtonDrawable(id);

Die erste Zeile gibt tatsächlich die Ressourcen-ID der btn_check_holo_light-Zeichenressource zurück. Da wir bereits festgestellt haben, dass dies die Schaltflächenselektion ist, die das Aussehen der CheckBox bestimmt, können wir sie im Widget als "button drawable" festlegen. Das Ergebnis ist eine CheckBox mit dem Erscheinungsbild der Holo.Light-Version, unabhängig davon, welches Design/Stil Sie für die Anwendung, Aktivität oder das Widget in XML festgelegt haben. Da hier nur die Schaltfläche einstellbar ist, müssen Sie das andere Styling manuell ändern. z.B. in Bezug auf das Aussehen des Textes.

Unten ein Screenshot, der das Ergebnis zeigt. Das obere Kontrollkästchen verwendet die oben beschriebene Methode (ich habe die Textfarbe in xml manuell auf Schwarz gesetzt), während das zweite die standardmäßige themenbasierte Holo-Formatierung verwendet (also nicht leicht).

Screenshot showing the result


Update2:

Mit der Einführung von Support Library v22.1.0 ist es jetzt viel einfacher geworden! Ein Zitat aus den Versionshinweisen (meine Betonung):

Lollipop fügte die Möglichkeit hinzu, das Thema in einer Ansicht nach Ansichtsebene mit dem Android:theme-XML-Attribut zu überschreiben - unglaublich nützlich für Dinge wie dunkle Aktionsleisten bei hellen Aktivitäten. AppCompat ermöglicht jetzt die Verwendung von Android:theme für Symbolleisten (wobei der zuvor verwendete app:theme verworfen wird), und noch besser. Er unterstützt Android:theme für alle Ansichten auf API 11+ -Geräten.

Mit anderen Worten: Sie können jetzt ein Thema auf per-view -Basis anwenden, was die Lösung des ursprünglichen Problems erheblich vereinfacht: Geben Sie einfach das Thema an, das Sie für die entsprechende Ansicht anwenden möchten. D.h. Vergleichen Sie im Zusammenhang mit der ursprünglichen Frage die folgenden Ergebnisse:

<CheckBox
    ...
    Android:theme="@Android:style/Theme.Holo" />

<CheckBox
    ...
    Android:theme="@Android:style/Theme.Holo.Light" />

Die erste CheckBox ist so gestaltet, als würde sie in einem dunklen Thema verwendet, die zweite wie in einem hellen Thema, unabhängig davon, welches Motiv für Ihre Aktivität oder Anwendung festgelegt ist.

Natürlich sollten Sie nicht mehr das Holo-Thema verwenden, sondern stattdessen Material.

116
MH.

Vielleicht wird dich das befriedigen - 

etwas.xml

<CheckBox
    Android:text="Custom CheckBox"
    Android:button="@drawable/checkbox_selector"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"/>

Auswahl

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_checked="true" Android:drawable="@drawable/star_down" />
    <item Android:state_checked="false" Android:drawable="@drawable/star" />
</selector>

Für die Referenz verweisen Sie einfach hier

56
Praveenkumar

Der korrekte Weg für das Materialdesign ist: 

Style:

<style name="MyCheckBox" parent="Theme.AppCompat.Light">  
    <item name="colorControlNormal">@color/foo</item>
    <item name="colorControlActivated">@color/bar</item>
</style>  

Layout :

<CheckBox  
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:checked="true"
    Android:text="Check Box"
    Android:theme="@style/MyCheckBox"/>

Es werden Materialanimationen auf Lollipop + beibehalten.

21
Rémy DAVID

Vielleicht möchtest du etwas wie:

<style name="CustomActivityTheme" parent="@Android:style/Theme.Holo">
    <item name="Android:checkboxStyle">@style/customCheckBoxStyle</item>
</style>

<style name="customCheckBoxStyle" parent="@Android:style/Widget.CompoundButton.CheckBox">
    <item name="Android:textColor">@Android:color/black</item>
</style>

Beachten Sie das textColor-Element.

4
Edwin Evans

In der vorherigen Antwort auch im Abschnitt <selector>...</selector> benötigen Sie möglicherweise:

<item Android:state_pressed="true" Android:drawable="@drawable/checkbox_pressed" ></item>
0
Alex Che