Gibt es eine einfache Möglichkeit, das Kontrollkästchen in einem CheckBox-Steuerelement und den zugehörigen Text aufzufüllen?
Ich kann nicht einfach führende Leerzeichen hinzufügen, da meine Beschriftung mehrzeilig ist.
Wie es ist, befindet sich der Text viel zu nahe am Kontrollkästchen:
TextView
withdrawableLeft
und usedrawablePadding
, um dem Text Platz zu geben. Schalten Sie im Code nur ausgewählte und nicht ausgewählte Zustände um.Antworten:
Ich hasse es, meine eigene Frage zu beantworten, aber in diesem Fall denke ich, dass ich muss. Nach dem Auschecken war @Falmarri mit seiner Antwort auf dem richtigen Weg. Das Problem ist, dass das CheckBox-Steuerelement von Android bereits die Eigenschaft android: paddingLeft verwendet, um den Text dort abzurufen, wo er sich befindet.
Die rote Linie zeigt den paddingLeft-Offsetwert der gesamten CheckBox
Wenn ich diese Auffüllung in meinem XML-Layout nur überschreibe, wird das Layout durcheinander gebracht. Folgendes bewirkt die Einstellung paddingLeft = "0":
Es stellt sich heraus, dass Sie dies in XML nicht beheben können. Sie haben es im Code getan. Hier ist mein Snippet mit einer fest codierten Padding-Erhöhung von 10dp.
Dies gibt Ihnen Folgendes, wobei die grüne Linie die Zunahme der Polsterung ist. Dies ist sicherer als das Hardcodieren eines Werts, da unterschiedliche Geräte unterschiedliche Zeichen für das Kontrollkästchen verwenden können.
UPDATE - Wie die Leute kürzlich in den Antworten unten erwähnt haben, hat sich dieses Verhalten anscheinend in Jelly Bean (4.2) geändert. Ihre App muss überprüfen, auf welcher Version sie ausgeführt wird, und die entsprechende Methode verwenden.
Für 4.3+ wird einfach padding_left gesetzt. Siehe htafoyas Antwort für Details.
quelle
paddingLeft="48sp"
? Funktioniert hier einwandfrei, auch wenn ich Maßstab und Ausrichtung ändere. Ihr Code hat mir unregelmäßige Auffüllwerte für eine Liste von Elementen gegeben.getView()
benutzerdefinierten Adapter verwenden (wenn Sie Ihre Ansichten recyceln), da die Auffüllung endlos zunimmt. Um dieses Problem zu beheben, musste ich Folgendes verwenden :boolean isHackNeeded = Build.VERSION.SDK_INT < 17; float scale = context.getResources().getDisplayMetrics().density; if (isHackNeeded) {CheckBox rb = new CheckBox(context); this.PADDING = rb.getPaddingLeft() + Math.round(10.0f * scale); } else { this.PADDING = Math.round(10.0f * scale); }
. Und dannPADDING
für jede CheckBox verwenden, die ich aufblase:check.setPadding(PADDING, check.getPaddingTop() ...
Angesichts der Antwort von @DougW ist die Verwaltung der Version einfacher. Ich füge sie meiner Kontrollkästchenansicht hinzu:
wo sich das Maß in zwei Werteordnern befindet:
Werte
Werte-v17 (4.2 JellyBean)
Ich habe eine benutzerdefinierte Prüfung, verwenden Sie die dps zu Ihrer besten Wahl.
quelle
values-v17
wie das Update in API 17 eingeführt wurde (gemäß einigen Posts oben)Verwenden Sie Attribut
android:drawableLeft
anstelle vonandroid:button
. Um die Auffüllung zwischen Zeichen- und Texteinstellung festzulegenandroid:drawablePadding
. Zum Zeichnen positionierbar verwendenandroid:paddingLeft
.quelle
android:background="@android:color/transparent"
und linker Rand verschwinden<item name="android:checkboxStyle">@style/CheckBox</item>
diese Weise haben Sie den Stil einmal definiert und nur einmal referenziert.Android 4.2 Jelly Bean (API 17) fügt den Text paddingLeft von buttonDrawable (ints rechter Rand) ein. Es funktioniert auch für den RTL-Modus.
Bevor 4.2 paddingLeft den buttonDrawable ignorierte, wurde er vom linken Rand der CompoundButton-Ansicht übernommen.
Sie können es über XML lösen - setzen Sie paddingLeft auf buttonDrawable.width + requiredSpace für ältere Androiden. Setzen Sie es nur unter API 17 auf requiredSpace. Verwenden Sie beispielsweise Dimensionsressourcen und überschreiben Sie sie im Ressourcenordner values-v17.
Die Änderung wurde über android.widget.CompoundButton.getCompoundPaddingLeft () eingeführt.
quelle
android:background="@android:color/transparent"
.Ja, Sie können Polster hinzufügen, indem Sie Polster hinzufügen.
android:padding=5dp
quelle
Wenn Sie ein sauberes Design ohne Codes wünschen, verwenden Sie:
Der Trick besteht darin, die Farbe für transparent auf transparent zu setzen
android:drawableLeft
und einen Wert für zuzuweisenandroid:drawablePadding
. Dank der Transparenz können Sie diese Technik auch für jede Hintergrundfarbe ohne Nebeneffekt anwenden - wie Farbfehlanpassung.quelle
API 17 und höher können Sie verwenden:
API 16 und niedriger können Sie verwenden:
quelle
In meinem Fall habe ich dieses Problem mithilfe des folgenden CheckBox-Attributs im XML gelöst:
* *
* *
quelle
Einfache Lösung: Fügen Sie diese Zeile in die CheckBox- Eigenschaften ein und ersetzen Sie 10 dp durch den gewünschten Abstandswert
quelle
Ich kenne keine Leute, aber ich habe getestet
<CheckBox android:paddingLeft="8mm"
und verschiebt nur den Text nach rechts, nicht das gesamte Steuerelement.Es passt mir gut.
quelle
Erweitern Sie stattdessen einfach die Android CheckBox, um eine bessere Polsterung zu erzielen. Auf diese Weise können Sie, anstatt es jedes Mal, wenn Sie die CheckBox verwenden, im Code reparieren zu müssen, stattdessen einfach die feste CheckBox verwenden.
Erste CheckBox erweitern:
Zweitens in Ihrer XML, anstatt eine normale CheckBox zu erstellen, erstellen Sie Ihre erweiterte
quelle
Ich bin gerade zu dem Schluss gekommen:
Überschreiben Sie das Kontrollkästchen und fügen Sie diese Methode hinzu, wenn Sie ein benutzerdefiniertes Zeichenelement haben:
oder dies, wenn Sie das System Drawable verwenden:
Danke für die Antwort :)
quelle
Dieses Verhalten scheint sich in Jelly Bean geändert zu haben. Der Trick paddingLeft fügt zusätzliches Auffüllen hinzu, sodass der Text zu weit rechts aussieht. Hat sonst noch jemand das bemerkt?
quelle
Verwenden Sie für das Leerzeichen zwischen dem Häkchen und dem Text:
Es wird jedoch mehr als 10 dp, da das Häkchen eine Auffüllung (ca. 5 dp) enthält. Wenn Sie Polster entfernen möchten, lesen Sie So entfernen Sie Polster um Android CheckBox :
quelle
quelle
Bad idea for usability
Nein, ist es nicht. Setzen Sie sowohl das Kontrollkästchen als auch die Textansicht in ein lineares Layout und machen Sie dieses lineare Layout berührbar.Wenn Sie eine benutzerdefinierte Bildauswahl für das Kontrollkästchen oder den Radiobutton haben, müssen Sie dieselbe Schaltfläche und Hintergrundeigenschaft wie diese festlegen:
Sie können die Größe des Kontrollkästchens oder des Optionsfelds mit der Hintergrundeigenschaft steuern.
quelle
Sie müssen nur einen Parameter in der XML-Datei haben
quelle
Das Setzen von minHeight und minWidth auf
0dp
war für mich die sauberste und direkteste Lösung für Android 9 API 28:quelle
Wenn Sie benutzerdefinierte Schaltflächen erstellen, sehen Sie z. B. das Tutorial zum Ändern des Erscheinungsbilds des Kontrollkästchens
Erhöhen Sie dann einfach die Breite von btn_check_label_background.9.png, indem Sie eine oder zwei weitere Spalten mit transparenten Pixeln in die Bildmitte einfügen. Lassen Sie die 9-Patch-Marker unverändert.
quelle
Was ich getan habe, ist ein
TextView
und einCheckBox
in einem (Verwandten)Layout
. DasTextView
zeigt den Text an, den der Benutzer sehen soll, und dasCheckBox
hat keinen Text. Auf diese Weise kann ich die Position / Polsterung von einstellen,CheckBox
wo immer ich will.quelle
Ich hatte das gleiche Problem mit einem Galaxy S3 mini (Android 4.1.2) und habe einfach mein benutzerdefiniertes Kontrollkästchen AppCompatCheckBox anstelle von CheckBox erweitern lassen. Jetzt funktioniert es perfekt.
quelle
Sie müssen die Größe des verwendeten Bildes ermitteln, um diese Größe mit Ihrer Polsterung zu versehen. Auf den Android-Interna erhalten sie das auf src angegebene Zeichenelement und verwenden anschließend dessen Größe. Da es sich um eine private Variable handelt und es keine Getter gibt, können Sie nicht darauf zugreifen. Außerdem können Sie den com.android.internal.R.styleable.CompoundButton nicht abrufen und von dort aus den Drawable abrufen.
Sie müssen also Ihr eigenes Styleable erstellen (z. B. custom_src), oder Sie können es direkt in Ihre Implementierung des RadioButton einfügen:
quelle
Da Sie wahrscheinlich einen Zeichen-Selektor für Ihre
android:button
Eigenschaft verwenden, müssen Sieandroid:constantSize="true"
ein Standard-Zeichenelement wie das folgende hinzufügen und / oder angeben:Danach müssen Sie ein
android:paddingLeft
Attribut in Ihrer Checkbox-XML angeben .Nachteile:
Im Layout-Editor wird der Text unter dem Kontrollkästchen mit API 16 und darunter angezeigt. In diesem Fall können Sie ihn beheben, indem Sie eine benutzerdefinierte Checkbox-Klasse wie vorgeschlagen erstellen , jedoch für API-Level 16.
Begründung:
Es handelt sich um einen Fehler, da der
StateListDrawable#getIntrinsicWidth()
Aufruf intern in verwendet wird.CompoundButton
Er kann jedoch einen< 0
Wert zurückgeben, wenn kein aktueller Status vorhanden ist und keine konstante Größe verwendet wird.quelle
Alles , was Sie dieses Problem zu überwinden tun müssen, ist hinzuzufügen ,
android:singleLine="true"
um diecheckBox
in Ihrem Android - xml - Layout:und nichts Besonderes wird programmgesteuert hinzugefügt.
quelle
Das Kontrollkästchenbild überlappte sich, als ich meine eigenen Zeichen aus dem Selektor verwendete. Ich habe dies mit dem folgenden Code gelöst:
Vielen Dank an Alex Semeniuk
quelle
Am Ende habe ich dieses Problem, indem ich die Bilder ändere. Gerade zusätzlichen transparenten Hintergrund in PNG-Dateien hinzugefügt. Diese Lösung funktioniert hervorragend auf allen APIs.
quelle
Vielleicht ist es zu spät, aber ich habe Dienstprogrammmethoden erstellt, um dieses Problem zu beheben.
Fügen Sie einfach diese Methoden zu Ihren Utensilien hinzu:
Und verwenden Sie wie folgt:
oder so:
quelle
Anstatt den Text für das Kontrollkästchen anzupassen, habe ich Folgendes getan und es hat bei allen Geräten für mich funktioniert. 1) Fügen Sie in XML nebeneinander ein Kontrollkästchen und eine Textansicht hinzu. Abstand halten. 2) Setzen Sie die Textgröße des Kontrollkästchens auf 0sp. 3) Fügen Sie dieser Textansicht neben dem Kontrollkästchen relativen Text hinzu.
quelle
<CheckBox android:drawablePadding="16dip"
- Der Abstand zwischen den Zeichen und dem Text.quelle