Chcę mieć przycisk Androida z wyśrodkowaną ikoną + tekstem. Używam atrybutu drawableLeft, aby ustawić obraz, działa to dobrze, jeśli przycisk ma szerokość, "wrap_content"
ale muszę rozciągnąć do maksymalnej szerokości, więc używam szerokości "fill_parent"
. Spowoduje to przeniesienie mojej ikony bezpośrednio na lewo od przycisku i chcę, aby zarówno ikona, jak i tekst były wyśrodkowane wewnątrz przycisku.
Próbowałem ustawić wypełnienie, ale to pozwala tylko na podanie stałej wartości, więc nie jest to, czego potrzebuję. Muszę mieć wyrównaną ikonę + tekst na środku.
<Button
android:id="@+id/startTelemoteButton"
android:text="@string/start_telemote"
android:drawableLeft="@drawable/start"
android:paddingLeft="20dip"
android:paddingRight="20dip"
android:width="fill_parent"
android:heigh="wrap_content" />
Jakieś sugestie, jak mogę to osiągnąć?
android
android-layout
user-interface
button
alignment
jloriente
źródło
źródło
Odpowiedzi:
android: drawableLeft zawsze zachowuje android: paddingLeft jako odległość od lewej krawędzi. Gdy przycisk nie jest ustawiony na android: width = "wrap_content", zawsze zawiesza się po lewej stronie!
W systemie Android 4.0 (poziom API 14) możesz użyć atrybutu android: drawableStart, aby umieścić element rysunkowy na początku tekstu. Jedynym rozwiązaniem kompatybilnym wstecz, które wymyśliłem, jest użycie ImageSpan do utworzenia łączonego tekstu + obrazu:
W moim przypadku musiałem również dostosować atrybut android: gravity przycisku, aby wyglądał na wyśrodkowany:
źródło
button.setText(buttonLabel)
Wiem, że spóźniłem się z odpowiedzią na to pytanie, ale to mi pomogło:
Znalazłem to rozwiązanie tutaj: Android UI ma problemy: tworzenie przycisku z wyśrodkowanym tekstem i ikoną
źródło
Użyłem LinearLayout zamiast Button . OnClickListener , które muszę używać działa poprawnie również dla LinearLayout.
źródło
Wszystkie poprzednie odpowiedzi wydają się być nieaktualne
Możesz użyć
MaterialButton
teraz, który pozwala ustawić grawitację ikony.Aby móc korzystać z komponentów materiałowych, będziesz oczywiście musiał:
Dodaj zależność
implementation 'com.google.android.material:material:1.3.0-alpha01'
(użyj najnowszej wersji)Rozszerz motyw kompozycji Material Components
Jeśli nie możesz tego zrobić, rozszerz go z motywu Material Bridge
źródło
Dostosowuję to, dodając wypełnienie po lewej i prawej stronie w następujący sposób:
źródło
Niedawno natknąłem się na ten sam problem. Próbowałem znaleźć tańsze rozwiązanie, więc wymyśliłem to.
Następnie wystarczy wywołać
OnClickListener
naLinearLayout
.Mam nadzieję, że to komuś pomoże, ponieważ wydaje się to bardzo częstym problemem. :)
źródło
Możesz użyć niestandardowego przycisku, który mierzy i rysuje się, aby pomieścić lewy rysik. Proszę znaleźć przykład i wykorzystanie tutaj
Stosowanie
źródło
To jest moje rozwiązanie, które napisałem 3 lata temu. Przycisk ma tekst i lewą ikonę i znajduje się w ramce, która jest tutaj rzeczywistym przyciskiem i można go rozciągnąć za pomocą fill_parent. Nie mogę tego ponownie przetestować, ale wtedy działało. Prawdopodobnie Button nie musi być używany i można go zastąpić TextView, ale nie będę go teraz testować i nie zmienia on tutaj zbytnio funkcjonalności.
źródło
Wiem, że to pytanie jest nieco starsze, ale być może nadal jesteś otwarty na wskazówki lub obejścia:
Utwórz RelativeLayout „wrap_content” z obrazem przycisku jako tłem lub samym przyciskiem jako pierwszym elementem układu. Pobierz LinearLayout i ustaw go na „layout_centerInParent” i „wrap_content”. Następnie ustaw swój Drawable jako Imageview. W końcu ustaw TextView z twoim tekstem (locale).
więc w zasadzie masz taką strukturę:
lub tak:
Wiem, że przy tym rozwiązaniu jest wiele elementów, z którymi trzeba sobie poradzić, ale możesz z nim bardzo łatwo stworzyć własny niestandardowy przycisk, a także ustawić dokładną pozycję tekstu i rysunków :)
źródło
Mój sposób na rozwiązanie tego problemu obejmował otoczenie przycisku lekkimi
<View ../>
elementami, które dynamicznie zmieniają rozmiar. Poniżej znajduje się kilka przykładów tego, co można dzięki temu osiągnąć:Zwróć uwagę, że klikalny obszar przycisków w przykładzie 3 jest taki sam jak w przykładzie 2 (tj. Zawiera spacje), co różni się od przykładu 4, w którym nie ma przerw „niemożliwych do kliknięcia” pomiędzy nimi.
Kod:
źródło
Spróbuj skorzystać z tej biblioteki
OmegaCenterIconButton
źródło
Możesz utworzyć niestandardowy widget:
Klasa IButton w języku Java:
}
Układ ibutton.xml
Aby korzystać z tego niestandardowego widżetu:
Musisz podać przestrzeń nazw dla atrybutów niestandardowych xmlns: ibutton = "http://schemas.android.com/apk/res/com.test.android.xxx", gdzie com.test.android.xxx to pakiet główny Aplikacja.
Po prostu umieść to poniżej xmlns: android = "http://schemas.android.com/apk/res/android".
Ostatnią rzeczą, której będziesz potrzebować, są atrybuty niestandardowe w attrs.xml.
W attrs.xml
Aby uzyskać lepsze pozycjonowanie, zawiń przycisk niestandardowy wewnątrz LinearLayout, jeśli chcesz uniknąć potencjalnych problemów z pozycjami RelativeLayout.
Cieszyć się!
źródło
Miał podobny problem, ale chciał mieć środek do rysowania bez tekstu i bez zawiniętych układów. Rozwiązaniem było stworzenie niestandardowego przycisku i dodanie jeszcze jednego elementu do rysowania oprócz LEWEGO, PRAWEGO, GÓRNEGO, DOLNEGO. Można łatwo modyfikować położenie rysowalne i ustawić je w żądanym położeniu względem tekstu.
CenterDrawableButton.java
attrs.xml
stosowanie
źródło
Umieść FrameLayout w LinearLayout i ustaw orientację na poziomą.
źródło
Możesz umieścić przycisk nad LinearLayout
źródło
Co się stanie, jeśli wypróbujesz android: gravity = "center_horizontal"?
źródło
Myślę, że android: gravity = "center" powinien działać
źródło
Jak sugeruje Rodja, przed wersją 4.0 nie ma bezpośredniego sposobu na wyśrodkowanie tekstu z rysunkiem. I rzeczywiście, ustawienie wartości padding_left powoduje odsunięcie elementu rysunkowego od granicy. Dlatego moja sugestia jest taka, aby w czasie działania obliczyć dokładnie ile pikseli od lewej krawędzi musi mieć twój rysowalny element, a następnie przekazać to za pomocą setPadding Twoje obliczenia mogą wyglądać mniej więcej tak
Szerokość twoich rysunków jest stała i możesz ją sprawdzić, a także obliczyć lub zgadnąć szerokość tekstu.
Na koniec musisz pomnożyć wartość wypełnienia przez gęstość ekranu, co możesz zrobić za pomocą DisplayMetrics
źródło
Nie testuję tego, ale wydaje mi się, że możesz użyć biblioteki CenteredContentButton
źródło
public class DrawableCenterTextView rozszerza TextView {
}
źródło
Brudna poprawka.
Ustalenie właściwej wyściółki rozwiązuje cel. Jednak w przypadku zróżnicowanego ekranu użyj innego wypełnienia i umieść go w zasobie dimens w odpowiednim folderze wartości.
źródło
Użyj RelativeLayout (kontener) i androida: layout_centerHorizontal = "true" , moja próbka:
źródło
Inna możliwość zachowania motywu przycisku.
Dzięki temu rozwiązaniu, jeśli dodasz @ color / your_color @ color / your_highlight_color w swoim motywie aktywności, możesz mieć motyw Matherial na Lollipop z cieniem i falowaniem, a dla poprzedniej wersji płaski przycisk z Twoim kolorem i podświetleniem po naciśnięciu.
Ponadto dzięki temu rozwiązaniu autoresize obrazu
Wynik: Najpierw na urządzeniu Lollipop Drugie: Na urządzeniu przed Lollipop 3: Na urządzeniu Pre Lollipop naciśnij przycisk
źródło
I koncentrowały
textView
się ikona użyciupaddingLeft
i TextView i wyrównując do lewej | centerVertical . i dla małej przerwy między widokiem a ikoną, którego użyłemdrawablePadding
źródło
android:paddingLeft
zadziałało.Może to być stary / zamknięty wątek, ale szukałem wszędzie, gdzie nie znalazłem nic przydatnego, dopóki nie zdecydowałem się stworzyć własnego rozwiązania. Jeśli jest tu ktoś, kto próbuje szukać odpowiedzi, spróbuj tego, może zaoszczędzić ci minuty na zastanawianiu się
Ponieważ układ liniowy działa jako kontener i ten, który ma selektor, po kliknięciu całego układu liniowego wyglądałby dokładnie tak, jak powinien. jeśli chcesz, aby obie strony były wyśrodkowane, użyj funkcji względnej insteaf. Jeśli chcesz, aby był wyśrodkowany w poziomie, zmień orientację na poziomą.
Zwróć uwagę NIE zapomnij dodać android: clickable = "true" do swojego głównego kontenera (względnego lub liniowego), aby akcja miała miejsce.
Znowu może to być stary wątek, ale nadal może komuś pomóc.
- szkoda, mam nadzieję, że to pomoże - zabawne zabawy.
źródło
Jeśli używasz jednego z rozwiązań widoku niestandardowego , zachowaj ostrożność, ponieważ często zawodzą one w przypadku długiego lub wielowierszowego tekstu . Przepisałem niektóre odpowiedzi, zastąpiłem
onDraw()
i zrozumiałem, że to zły sposób.źródło
Widziałem rozwiązania do wyrównywania rysunków na początku / w lewo, ale nic na koniec do rysowania / po prawej, więc wymyśliłem to rozwiązanie. Używa dynamicznie obliczanych dopełnień do wyrównywania rysunków i tekstu po lewej i prawej stronie.
Ważne jest, aby ustawić grawitację w swoim układzie na „center_vertical | start” lub „center_vertical | end” w zależności od tego, gdzie ustawisz ikonę. Na przykład:
Jedynym problemem związanym z tą implementacją jest to, że przycisk może mieć tylko jedną linię tekstu, w przeciwnym razie obszar tekstu wypełnia przycisk, a dopełnienie będzie wynosić 0.
źródło
Użyj tego
android:background="@drawable/ic_play_arrow_black_24dp"
po prostu ustaw tło na ikonę, którą chcesz wyśrodkować
źródło