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:
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
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:
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.
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.
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.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"
/>
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 ();
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
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.
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"
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 "
*
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"
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ę.
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" />
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
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ź:)
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" />
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ł?
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"
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" />
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.
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ą.
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ę.
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.
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;
}
}
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ść.
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.
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
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.
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);
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.
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.
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