Czy istnieje prosty sposób na dodanie dopełnienia między polem wyboru w kontrolce CheckBox a powiązanym tekstem?
Nie mogę po prostu dodać wiodących spacji, ponieważ moja etykieta jest wielowierszowa.
Na obecnym etapie tekst jest zbyt blisko pola wyboru:
TextView
pomocądrawableLeft
i użycie,drawablePadding
aby zwolnić miejsce na tekst. W kodzie po prostu przełączaj wybrane i niezaznaczone stany.Odpowiedzi:
Nienawidzę odpowiadać na własne pytanie, ale w tym przypadku myślę, że muszę. Po sprawdzeniu, @Falmarri był na dobrej drodze ze swoją odpowiedzią. Problem polega na tym, że kontrolka CheckBox systemu Android korzysta już z właściwości android: paddingLeft, aby uzyskać tekst tam, gdzie jest.
Czerwona linia pokazuje wartość przesunięcia paddingLeft dla całego CheckBox
Jeśli po prostu zastąpię to wypełnienie w moim układzie XML, spowoduje to popsucie układu. Oto, co robi ustawienie paddingLeft = "0":
Okazuje się, że nie można tego naprawić w XML. Zrobisz to w kodzie. Oto mój fragment kodu ze zwiększonym zakresem wypełnienia o 10dp.
To daje następujące, gdzie zielona linia to wzrost wypełnienia. Jest to bezpieczniejsze niż zapisywanie wartości na stałe, ponieważ różne urządzenia mogą używać różnych rysunków dla pola wyboru.
AKTUALIZACJA - jak ludzie ostatnio wspomnieli 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 jest uruchomiona, i użyć odpowiedniej metody.
W wersji 4.3+ jest to po prostu ustawienie padding_left. Szczegółowe informacje można znaleźć w odpowiedzi htafoya.
źródło
paddingLeft="48sp"
? Działa tutaj dobrze, nawet jeśli zmienię skalę i orientację. Twój kod podał mi nieprawidłowe wartości wypełnienia na liście elementów.getView()
niestandardowym adapterze (jeśli przetworzysz swoje widoki), ponieważ wypełnienie będzie się zwiększać w nieskończoność. Aby rozwiązać ten problem, musiałem użyć coś takiego: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); }
. A następnie użyjPADDING
dla każdego napełnionego CheckBox:check.setPadding(PADDING, check.getPaddingTop() ...
Biorąc pod uwagę odpowiedź @DougW, co robię, aby zarządzać wersją, jest prostsze, dodaję do mojego pola wyboru:
gdzie dimen znajduje się w dwóch folderach wartości:
wartości
wartości-v17 (4.2 JellyBean)
Mam niestandardowy czek, użyj dps do najlepszego wyboru.
źródło
values-v17
tak, jak poprawka została wprowadzona w API 17 (zgodnie z niektórymi powyższymi postami)Użyj atrybutu
android:drawableLeft
zamiastandroid:button
. Aby ustawić wypełnienie między rysowaniem a tekstemandroid:drawablePadding
. Aby ustawić wysuwane użycieandroid:paddingLeft
.źródło
android:background="@android:color/transparent"
i lewy margines zniknie<item name="android:checkboxStyle">@style/CheckBox</item>
sposób : W ten sposób styl zostanie zdefiniowany tylko raz, a odniesienie do niego będzie możliwe tylko raz.Android 4.2 Jelly Bean (API 17) umieszcza tekst paddingLeft z przyciskuDrawable (ints prawa krawędź). Działa również w trybie RTL.
Przed 4.2 paddingLeft ignorował przyciskDrawable - został pobrany z lewej krawędzi widoku CompoundButton.
Możesz to rozwiązać za pomocą XML - ustaw paddingLeft na buttonDrawable.width + wymaganySpace na starszych androidach. Ustaw na wymagane Miejsce tylko w API 17 w górę. Na przykład użyj zasobów wymiarów i zastąp w folderze zasobów wartości-17.
Zmiana została wprowadzona za pośrednictwem android.widget.CompoundButton.getCompoundPaddingLeft ();
źródło
android:background="@android:color/transparent"
.Tak, możesz dodać dopełnienie, dodając dopełnienie.
android:padding=5dp
źródło
Jeśli chcesz mieć czysty design bez kodów, użyj:
Sztuką jest ustawienie koloru na przezroczysty
android:drawableLeft
i przypisanie wartościandroid:drawablePadding
. Ponadto przezroczystość pozwala na użycie tej techniki na dowolnym kolorze tła bez efektu ubocznego - np. Niedopasowanie kolorów.źródło
API 17 i wyżej, możesz użyć:
API 16 i poniżej, możesz użyć:
źródło
W moim przypadku rozwiązałem ten problem za pomocą następującego atrybutu CheckBox w pliku XML:
*
*
źródło
Proste rozwiązanie, dodaj ten wiersz do właściwości CheckBox , zastąp 10dp żądaną wartością odstępu
źródło
Nie znam facetów, ale testowałem
<CheckBox android:paddingLeft="8mm"
i przesuwa tylko tekst w prawo, a nie całą kontrolę.To mi odpowiada.
źródło
Dlaczego nie po prostu rozszerzyć Android CheckBox, aby zamiast tego mieć lepszą wypełnienie. W ten sposób zamiast konieczności poprawiania go w kodzie za każdym razem, gdy używasz CheckBox, możesz zamiast tego użyć po prostu ustalonego CheckBox.
Najpierw rozszerz CheckBox:
Po drugie w swoim xml zamiast tworzenia normalnego CheckBox utwórz swój rozszerzony
źródło
Właśnie do tego doszedłem:
Zastąp CheckBox i dodaj tę metodę, jeśli masz niestandardowy program do rysowania:
lub to, jeśli używasz systemu do rysowania:
Dziękuję za odpowiedź :)
źródło
Wygląda na to, że to zachowanie zmieniło się w Jelly Bean. Sztuczka paddingLeft dodaje dodatkowe dopełnienie, dzięki czemu tekst wygląda zbyt daleko w prawo. Czy ktoś to zauważył?
źródło
Aby wstawić spację między znacznikiem wyboru a tekstem, użyj:
Ale staje się on większy niż 10dp, ponieważ znacznik wyboru zawiera dopełnienie (około 5dp) wokół. Jeśli chcesz usunąć wypełnienie, zobacz Jak usunąć wypełnienie wokół Androida CheckBox :
źródło
źródło
Bad idea for usability
Nie, nie jest. Umieść zarówno pole wyboru, jak i widok tekstu w układzie liniowym i spraw, aby liniowy układ był dotykalny.Jeśli masz niestandardowy selektor obrazu dla pola wyboru lub przycisku radiowego, musisz ustawić tę samą właściwość przycisku i tła, taką jak ta:
Możesz kontrolować rozmiar pola wyboru lub wypełnienia przycisku opcji za pomocą właściwości tła.
źródło
tylko musisz mieć jeden parametr w pliku xml
źródło
Ustawienie minHeight i minWidth
0dp
było najczystszym i najprostszym rozwiązaniem dla mnie w systemie Android 9 API 28:źródło
Jeśli tworzysz niestandardowe przyciski, np. Zobacz zmianę wyglądu samouczka pola wyboru
Następnie po prostu zwiększ szerokość btn_check_label_background.9.png, dodając jedną lub dwie kolejne kolumny przezroczystych pikseli na środku obrazu; pozostaw znaczniki z 9 łatami takimi, jakie są.
źródło
To, co zrobiłem, to posiadanie
TextView
iCheckBox
wewnątrz (Relative)Layout
. WTextView
wyświetla tekst, który chcę użytkownika, aby zobaczyć, aCheckBox
nie ma żadnego tekstu. W ten sposób mogę ustawić pozycję / wypełnienie wCheckBox
dowolnym miejscu.źródło
Miałem ten sam problem z Galaxy S3 mini (Android 4.1.2) i po prostu sprawiłem, że moje niestandardowe pole wyboru rozszerza AppCompatCheckBox zamiast CheckBox. Teraz działa idealnie.
źródło
Musisz dodać rozmiar obrazu, którego używasz, aby dodać dopełnienie do tego rozmiaru. W urządzeniach wewnętrznych z systemem Android są one dostępne do rysowania, które określasz na src, a następnie używają jego rozmiaru. Ponieważ jest to zmienna prywatna i nie ma żadnych pobierających, do których nie można uzyskać dostępu. Ponadto nie możesz uzyskać com.android.internal.R.styleable.CompoundButton i stamtąd można pobrać.
Musisz więc stworzyć swój własny styl (np. Custom_src) lub możesz dodać go bezpośrednio w swojej implementacji RadioButton:
źródło
Ponieważ prawdopodobnie używasz selektora do rysowania dla swojej
android:button
właściwości, musisz dodaćandroid:constantSize="true"
i / lub określić domyślną rysowną w następujący sposób:Następnie musisz określić
android:paddingLeft
atrybut w polu wyboru xml.Cons:
W edytorze układu pojawi się tekst pod polem wyboru z interfejsem API 16 i niższym, w takim przypadku możesz to naprawić, tworząc niestandardową klasę pola wyboru, jak sugerowano, ale dla interfejsu API poziomu 16.
Racjonalne uzasadnienie:
jest to błąd, ponieważ
StateListDrawable#getIntrinsicWidth()
wywołanie jest używane wewnętrznie,CompoundButton
ale może zwrócić< 0
wartość, jeśli nie ma aktualnego stanu i nie jest używany stały rozmiar.źródło
Wszystko, co musisz zrobić, aby rozwiązać ten problem, to dodać
android:singleLine="true"
docheckBox
układu xml w Androidzie:i nic specjalnego nie zostanie dodane programowo.
źródło
Obraz pola wyboru zachodził na siebie, gdy używałem własnych drawables z selektora, rozwiązałem to za pomocą poniższego kodu:
Dzięki Alex Semeniuk
źródło
Kończę z tym problemem, zmieniając obrazy. Właśnie dodałem dodatkowe przezroczyste tło w plikach png. To rozwiązanie działa doskonale na wszystkich interfejsach API.
źródło
Może jest już za późno, ale stworzyłem narzędzia do zarządzania tym problemem.
Po prostu dodaj te metody do swoich narzędzi:
I użyj tego:
lub tak:
źródło
Zamiast dostosowywać tekst dla Checkbox, zrobiłem następujące rzeczy i zadziałało to dla wszystkich urządzeń. 1) W XML dodaj pole wyboru i widok tekstu obok siebie; utrzymywanie dystansu. 2) Ustaw rozmiar pola wyboru na 0sp. 3) Dodaj względny tekst do tego widoku obok pola wyboru.
źródło
<CheckBox android:drawablePadding="16dip"
- Wypełnienie między rysunkami a tekstem.źródło