Android-odstęp między Checkboxem a tekstem

Czy istnieje łatwy sposób na dodanie wypełnienia między pole wyboru w kontrolce pola wyboru, a powiązanym tekstem?

Nie mogę po prostu dodać interlinii, ponieważ moja etykieta jest wielowierszowa.

Jak-jest, tekst jest zbyt blisko pola wyboru: alt text

Author: DougW, 2010-10-27

29 answers

Nienawidzę odpowiadać na własne pytanie, ale w tym przypadku myślę, że muszę. Po sprawdzeniu, @ Falmarri był na dobrej drodze z odpowiedzią. Problem polega na tym, że kontrola checkbox Androida już używa właściwości android: paddingLeft, aby uzyskać tekst, gdzie jest.

Czerwona linia pokazuje wartość przesunięcia paddingLeft całego pola wyboru

alt text

Jeśli tylko nadpiszę to wypełnienie w moim układzie XML, spowoduje to bałagan w układzie. Oto jakie ustawienie paddingLeft= " 0" czy:

alt text

Okazuje się, że nie można tego naprawić w XML. Musisz to zrobić kodem. Oto mój fragment z hardcoded padding wzrost 10dp.

final float scale = this.getResources().getDisplayMetrics().density;
checkBox.setPadding(checkBox.getPaddingLeft() + (int)(10.0f * scale + 0.5f),
        checkBox.getPaddingTop(),
        checkBox.getPaddingRight(),
        checkBox.getPaddingBottom());

Daje to następujące, gdzie zielona linia jest wzrostem wypełnienia. Jest to bezpieczniejsze niż kodowanie na twardo wartości, Ponieważ różne urządzenia mogą używać różnych rysunków dla pola wyboru.

alt text

UPDATE-jak ludzie ostatnio wspominali w odpowiedziach poniżej, to zachowanie najwyraźniej zmieniło się w Jelly Bean (4.2). Twoja aplikacja będzie musiała sprawdzić, na której wersji działa i użyć odpowiedniej metody.

Dla 4.3 + jest to po prostu ustawienie padding_left. Zobacz odpowiedź htafoya po szczegóły.

 340
Author: DougW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-04 09:07:53

Biorąc pod uwagę odpowiedź @DougW, to co robię, aby zarządzać wersją jest prostsze, dodaję do mojego widoku checkbox:

android:paddingLeft="@dimen/padding_checkbox"

Gdzie dimen znajduje się w dwóch folderach wartości:

Wartości

<resources>

    <dimen name="padding_checkbox">0dp</dimen>

</resources>

Wartości-v17 (4.2)

<resources>

    <dimen name="padding_checkbox">10dp</dimen>

</resources>
Mam Niestandardowy czek, użyj dps do najlepszego wyboru.
 138
Author: htafoya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-22 06:27:24

Użyj atrybutu android:drawableLeft zamiast android:button. W celu ustawienia wypełnienia między drawable a text użyj android:drawablePadding. Do pozycjonowania drawable use android:paddingLeft.

<CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:button="@null"
        android:drawableLeft="@drawable/check_selector"
        android:drawablePadding="-50dp"
        android:paddingLeft="40dp"
        />

wynik

 72
Author: Roman Trokhymets,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-28 11:32:35

Android 4.2 Jelly Bean (API 17) umieszcza tekst paddingLeft od przycisku (ints prawej krawędzi). Działa również w trybie RTL.

Przed 4.2 paddingLeft ignorował buttonDrawable - został wzięty z lewej krawędzi widoku CompoundButton.

Można go rozwiązać za pomocą XML - set paddingLeft do buttonDrawable.szerokość + wymagana przestrzeń na starszych androidach. Ustaw go na requiredSpace tylko na API 17 up. Na przykład użyj zasobów wymiaru i nadpisuj w zasobie values-V17 folder.

Zmiana została wprowadzona za pomocą Androida.widget.CompoundButton.getCompoundPaddingLeft ();

 34
Author: kotucz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-29 18:05:44

Tak, możesz dodać padding dodając padding.

android:padding=5dp

 30
Author: Falmarri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-27 21:15:47

Jeśli chcesz mieć czysty projekt bez kodów, użyj:

<CheckBox
   android:id="@+id/checkBox1"
   android:layout_height="wrap_content"
   android:layout_width="wrap_content"
   android:drawableLeft="@android:color/transparent"
   android:drawablePadding="10dp"
   android:text="CheckBox"/>

Sztuką jest ustawienie koloru na przezroczysty dla android:drawableLeft i przypisanie wartości dla android:drawablePadding. Ponadto przezroczystość pozwala na użycie tej techniki na dowolnym kolorze tła bez efektu ubocznego - jak niedopasowanie kolorów.

 21
Author: ChuongPham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-06 18:30:06

API 17 i wyżej, możesz użyć:

Android: paddingStart= "24dp"

API 16 i poniżej, możesz użyć:

Android: paddingLeft= "24dp"

 16
Author: Inmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-31 04:12:43

W moim przypadku rozwiązałem ten problem używając następującego atrybutu CheckBox w XML:

*

Android: paddingLeft=" @ dimen/activity_horizontal_margin "

*

 16
Author: Mohammad Zakaria,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-23 08:16:19

Proste rozwiązanie, dodaj tę linię w polu wyboru właściwości, zamień 10dp na żądaną wartość odstępu

android:paddingLeft="10dp"
 14
Author: Naveed Ahmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-07 12:45:59

Nie znam facetów, ale testowałem

<CheckBox android:paddingLeft="8mm" i przenosi tylko tekst w prawo, a nie całą kontrolę.

Mi pasuje.
 11
Author: Tiago,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-12 12:54:03

Dlaczego po prostu nie rozszerzyć pole wyboru Androida, aby mieć lepsze wypełnienie zamiast. W ten sposób zamiast naprawiać to w kodzie za każdym razem, gdy używasz pola wyboru, możesz po prostu użyć tego pola.

Pierwsze Pole Wyboru Extend:

package com.whatever;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.CheckBox;

/**
 * This extends the Android CheckBox to add some more padding so the text is not on top of the
 * CheckBox.
 */
public class CheckBoxWithPaddingFix extends CheckBox {

    public CheckBoxWithPaddingFix(Context context) {
        super(context);
    }

    public CheckBoxWithPaddingFix(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public CheckBoxWithPaddingFix(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public int getCompoundPaddingLeft() {
        final float scale = this.getResources().getDisplayMetrics().density;
        return (super.getCompoundPaddingLeft() + (int) (10.0f * scale + 0.5f));
    }
}

Drugi w xml zamiast tworzyć normalne pole wyboru Utwórz swój Rozszerzony

<com.whatever.CheckBoxWithPaddingFix
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello there" />
 10
Author: w.donahue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-14 21:40:05

Dla spacji między znacznikiem wyboru a tekstem użyj:

android:paddingLeft="10dp"

Ale staje się więcej niż 10dp, ponieważ znak kontrolny zawiera wypełnienie (około 5dp) wokół. Jeśli chcesz usunąć padding, zobacz Jak usunąć padding wokół Android CheckBox :

android:paddingLeft="-5dp"
android:layout_marginStart="-5dp"
android:layout_marginLeft="-5dp"
// or android:translationX="-5dp" instead of layout_marginLeft
 7
Author: CoolMind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-21 15:55:30

Właśnie doszedłem do tego:

Zastąp pole wyboru i dodaj tę metodę, jeśli masz niestandardowy drawable:

@Override
public int getCompoundPaddingLeft() {

    // Workarround for version codes < Jelly bean 4.2
    // The system does not apply the same padding. Explantion:
    // http://stackoverflow.com/questions/4037795/android-spacing-between-checkbox-and-text/4038195#4038195

    int compoundPaddingLeft = super.getCompoundPaddingLeft();

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
        Drawable drawable = getResources().getDrawable( YOUR CUSTOM DRAWABLE );
        return compoundPaddingLeft + (drawable != null ? drawable.getIntrinsicWidth() : 0);
    } else {
        return compoundPaddingLeft;
    }

}

Lub to jeśli używasz systemu drawable:

@Override
public int getCompoundPaddingLeft() {

    // Workarround for version codes < Jelly bean 4.2
    // The system does not apply the same padding. Explantion:
    // http://stackoverflow.com/questions/4037795/android-spacing-between-checkbox-and-text/4038195#4038195

    int compoundPaddingLeft = super.getCompoundPaddingLeft();

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
        final float scale = this.getResources().getDisplayMetrics().density;
        return compoundPaddingLeft + (drawable != null ? (int)(10.0f * scale + 0.5f) : 0);
    } else {
        return compoundPaddingLeft;
    }

}

Dzięki za odpowiedź:)

 6
Author: PaNaVTEC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-31 14:22:49

Ustawienie minHeight i minWidth na 0dp było dla mnie najczystszym i najbardziej directestowym rozwiązaniem na Androida 9 API 28:

<CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="0dp"
        android:minWidth="0dp" />
 5
Author: ManuelTS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-06 09:53:59

Wygląda na to, że to zachowanie zmieniło się w Jelly Bean. Sztuczka paddingLeft dodaje dodatkowe wypełnienie, przez co tekst wygląda zbyt dobrze. Ktoś jeszcze to zauważył?

 4
Author: extreme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-12 22:45:49

Tylko musisz mieć jeden parametr w pliku xml

android:paddingLeft="20dp"
 3
Author: tej shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-22 09:18:53
<CheckBox
        android:paddingRight="12dip" />
 2
Author: AndrewKS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-27 21:17:23

Jeśli masz własny selektor obrazu dla checkbox lub radiobutton, musisz ustawić ten sam przycisk i właściwość tła, taką jak Ta:

            <CheckBox
                android:id="@+id/filter_checkbox_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:button="@drawable/selector_checkbox_filter"
                android:background="@drawable/selector_checkbox_filter" />

Możesz kontrolować rozmiar pola wyboru lub wypełnienia przycisku radiowego za pomocą właściwości background.

 2
Author: Ilya Lisway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-24 12:39:30

Jeśli tworzysz niestandardowe przyciski, np. zobacz Zmień Wygląd checkbox tutorial

Następnie po prostu zwiększ szerokość btn_check_label_background.9.png dodając jedną lub dwie kolumny przezroczystych pikseli na środku obrazu; pozostaw znaczniki 9-łat w takim stanie, w jakim są.

 1
Author: Keith Beardmore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-26 15:21:44

To, co zrobiłem, to posiadanie TextView i CheckBox wewnątrz (względnego)Layout. TextView wyświetla tekst, który ma zobaczyć użytkownik, a CheckBox nie ma żadnego tekstu. W ten sposób mogę ustawić pozycję / wypełnienie CheckBox gdzie chcę.

 1
Author: mbmc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-05 01:33:35

Miałem ten sam problem z Galaxy S3 mini (android 4.1.2) i po prostu zrobiłem mój Niestandardowy checkbox rozszerzyć AppCompatCheckBox zamiast CheckBox. Teraz działa idealnie.

 1
Author: Quentin G.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-16 16:16:04

Musisz uzyskać Rozmiar obrazu, którego używasz, aby dodać wyściółkę do tego rozmiaru. Na Androidzie wewnętrzne, dostają rysowalne można określić na src i użyć jego rozmiar później. Ponieważ jest to zmienna prywatna i nie ma getterów, nie możesz uzyskać do niej dostępu. Również nie można uzyskać com.android.wewnętrzne.R. styleable.CompoundButton I get the drawable from there.

Więc musisz stworzyć swój własny styl (np. custom_src) lub możesz go dodać bezpośrednio w swoim wykonanie RadioButton:

public class CustomRadioButton extends RadioButton {

    private Drawable mButtonDrawable = null;

    public CustomRadioButton(Context context) {
        this(context, null);
    }

    public CustomRadioButton(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CustomRadioButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mButtonDrawable = context.getResources().getDrawable(R.drawable.rbtn_green);
        setButtonDrawable(mButtonDrawable);
    }

    @Override
    public int getCompoundPaddingLeft() {
        if (Util.getAPILevel() <= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            if (drawable != null) {
                paddingLeft += drawable.getIntrinsicWidth();
            }
        }
        return paddingLeft;
    }
}
 0
Author: hudomju,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-13 17:21:31

Ponieważ prawdopodobnie używasz selektora drawable dla swojej właściwości android:button, musisz dodać android:constantSize="true" i / lub określić domyślną drawable w następujący sposób:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:constantSize="true">
  <item android:drawable="@drawable/check_on" android:state_checked="true"/>
  <item android:drawable="@drawable/check_off"/>
</selector>

Następnie należy podać atrybut android:paddingLeft w polu wyboru XML.

Wady:

W edytorze układu będzie tekst przechodzący pod checkbox z api 16 i poniżej, w takim przypadku można to naprawić, tworząc własną klasę checkbox jak sugerowane ale dla poziomu api 16.

Uzasadnienie:

Jest to błąd, ponieważ wywołanie StateListDrawable#getIntrinsicWidth() jest używane wewnętrznie w CompoundButton, ale może zwrócić wartość < 0, Jeśli nie ma aktualnego stanu i nie jest używana stała wielkość.

 0
Author: Gianluca P.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-28 15:35:02

Wszystko, co musisz zrobić, aby rozwiązać ten problem, to dodać android:singleLine="true" do checkBox w układzie XML Androida:

<CheckBox 
   android:id="@+id/your_check_box"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:singleLine="true"
   android:background="@android:color/transparent"
   android:text="@string/your_string"/>

I nic specjalnego nie zostanie dodane programowo.

 0
Author: Muhammed Refaat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-10 21:06:17

Obrazek checkboxa nakładał się, gdy używałem własnych rysunków z selektora, rozwiązałem to za pomocą poniższego kodu:

CheckBox cb = new CheckBox(mActivity);
cb.setText("Hi");
cb.setButtonDrawable(R.drawable.check_box_selector);
cb.setChecked(true);
cb.setPadding(cb.getPaddingLeft(), padding, padding, padding);

Dzięki Alex Semeniuk

 0
Author: Jaiprakash Soni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-16 10:25:33

Kończę z tym problemem zmieniając obrazy. Właśnie dodano dodatkowe przezroczyste tło w plikach png. To rozwiązanie działa doskonale na wszystkich interfejsach API.

 0
Author: Leo Droidcoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-22 11:58:40

Może jest już za późno, ale stworzyłem narzędzia do zarządzania tym problemem.

Po prostu dodaj tę metodę do swoich utils:

public static void setCheckBoxOffset(@NonNull  CheckBox checkBox, @DimenRes int offsetRes) {
    float offset = checkBox.getResources().getDimension(offsetRes);
    setCheckBoxOffsetPx(checkBox, offset);
}

public static void setCheckBoxOffsetPx(@NonNull CheckBox checkBox, float offsetInPx) {
    int leftPadding;
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN) {
        leftPadding = checkBox.getPaddingLeft() + (int) (offsetInPx + 0.5f);
    } else {
        leftPadding = (int) (offsetInPx + 0.5f);
    }
    checkBox.setPadding(leftPadding,
            checkBox.getPaddingTop(),
            checkBox.getPaddingRight(),
            checkBox.getPaddingBottom());
}

I użyj tak:

    ViewUtils.setCheckBoxOffset(mAgreeTerms, R.dimen.space_medium);

Lub w ten sposób:

    // Be careful with this usage, because it sets padding in pixels, not in dp!
    ViewUtils.setCheckBoxOffsetPx(mAgreeTerms, 100f);
 0
Author: Oleksandr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-24 12:20:12

Zamiast dostosowywać tekst dla Checkbox, zrobiłem następujące rzeczy i działało dla mnie na wszystkich urządzeniach. 1) w XML, Dodaj pole wyboru i textview do sąsiadujących jeden po drugim; zachowując pewną odległość. 2) Ustaw rozmiar tekstu pole wyboru na 0sp. 3) Dodaj tekst względny do tego widoku tekstowego obok pola wyboru.

 -1
Author: Pankaj Deshpande,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-15 15:10:31

<CheckBox android:drawablePadding="16dip" - wypełnienie między rysunkami a tekstem.

 -3
Author: user1879118,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-09 06:44:37