Bir RadioButton ile Android'deki etiketi arasına kenar boşluğu eklensin mi?


90

Hala Android'in yerleşik bileşenlerini kullanırken RadioButton ile etiket arasına biraz boşluk eklemek mümkün müdür? Varsayılan olarak metin biraz ezilmiş görünür.

<RadioButton android:id="@+id/rb1"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:text="My Text"/>

Birkaç şey denedim:

  1. Kenar boşluğunu ve dolguyu belirtmek, tüm öğenin (düğme ve metin birlikte) etrafına boşluk ekliyor gibi görünüyor. Bu mantıklı ama ihtiyacım olan şeyi yapmıyor.

  2. XML aracılığıyla, kontrol edilen ve kontrol edilmeyen durumlar için görüntüleri belirleyen özel bir çizilebilir oluşturma, ardından her görüntünün sağ tarafına birkaç ekstra piksel ekleme. Bu işe yaramalı, ancak şimdi varsayılan kullanıcı arayüzünün dışına çıkıyorsunuz. (Dünyanın sonu değil, ideal değil)

  3. Her etiketin başına fazladan boşluk ekleyin. Android, "Dizim" 'de olduğu gibi baştaki bir boşluk karakterini kırpıyor gibi görünüyor, ancak "\ u00A0My String" de olduğu gibi, unicode U + 00A0 belirtilmesi işinizi görüyor. Bu işe yarıyor, ancak biraz kirli görünüyor.

Daha iyi bir çözüm var mı?

Yanıtlar:


121

Bunu şimdi okuyan herkes için, kabul edilen cevap, yeni API'lerde çok fazla dolguya neden olan bazı düzen sorunlarına yol açacaktır.

API <= 16'da paddingLeft, dolguyu radyo düğmesinin görünüm sınırlarına göre ayarlamak için radyo düğmesini ayarlayabilirsiniz. Ek olarak, bir yama dokuz arka planı da görünüm sınırlarını görünüme göre değiştirir.

API> = 17'de paddingLeft(veya paddingStart), radyo düğmesi çekilebilir ile ilişkilidir. Aynı durum dokuzuncu yama için de geçerli. Dolgu farklılıklarını daha iyi göstermek için ekli ekran görüntüsüne bakın.

Kodu araştırırsanız , API 17'de getHorizontalOffsetForDrawables adlı yeni bir yöntem bulacaksınız . Bu yöntem, bir radyo düğmesi için sol dolgu hesaplanırken çağrılır (bu nedenle, resimde gösterilen ek alan).

TL; DR Sadece > = 17 ise kullanın paddingLeft. minSdkVersionAPI <= 16'yı destekliyorsanız, desteklediğiniz minimum SDK için radyo düğmesi stiline ve API 17+ için başka bir stile sahip olmalısınız.

API sürümleri arasındaki sol dolgu farklılıklarını gösteren ekran görüntülerini birleştirin


2
api 17 android.os.Build.VERSION_CODES.JELLY_BEAN_MR1
KarenAnne

11
Bunu yapmanın en iyi yolu bir "değerler-v17" dizinidir; API 17+ boyutunuzu oradaki bir kaynaklar xml'ye ve 16 ve altı için standart olanı yalnızca düz "değerler" olarak yerleştirin.
akent

16
Google geliştiricilerinin / yönetiminin bize olağan geliştiricilerle davranışı şaşırtıcı. İstedikleri zaman, istedikleri zaman yaparlar. Tutarlılık ve bütünlük onlar için hiçbir şey ifade etmiyor.
Yar

66

Bunun sorununuzu çözüp çözmeyeceğinden emin değilim, ancak Radio Button'ın "Padding left" özelliğini 50dip veya daha yüksek bir değerle denediniz mi?


2
Bu çalışır ve varsayılan çekilebilirliğin genişliğini kaplamak için 50dip gerekir. İlk başta 20dip kullandım ve metin sola taşındı! Bunun nedeni, bağlantı noktasının çekilebilir ürünün sağ kenarı olmamasıdır; çekilebilir ürünün sol kenarıdır.
Robert Claypool

58

Birkaç yol denedim ve bunun hem emülatörde hem de cihazlarda doğru şekilde çalışmasını bitirdim:

    <RadioButton
        android:background="@android:color/transparent"
        android:button="@null"
        android:drawableLeft="@drawable/your_own_selector"
        android:drawablePadding="@dimen/your_spacing" />
  • android: arka plan api10'da göründüğü gibi şeffaf olmalıdır, içsel dolguları olan bir arka plan vardır (diğer apis'lerle denenmemiştir ancak çözüm diğerlerinde de çalışır)
  • android: aksi takdirde dolgular düzgün çalışmayacağından düğmenin boş olması gerekir
  • android: drawableLeft , android: button yerine belirtilmelidir
  • android: drawablePadding , çizilebilir ve metniniz arasında olacak alandır.

4
En iyi cevap! Ayrıca android: background = "@ null" ayarını da yapabilirsiniz ve belirttiğiniz gibi hiçbir dolgu olmadan görünecektir.
saiyancoder

2
android: button = "@ null" ayarını yaptığımda radyo düğmesi kontrol edilmiyor (tıklanmıyor). Yanlış bir şey yapıyorum. lütfen stackoverflow.com/questions/28052820/…
Shirish Herwade

@Shirish'in bu çözümün düğmenizin tıklanmamasıyla ilgisi yok. Sadece uyguladım ve tıklandı.
Yar

Çözüm için teşekkürler!
Vimalathithan Rajasekaran

33

Ekle marjı bir arasındaki radiobutton onun etiket tarafından paddingLeft :

android:paddingLeft="10dip"

Sadece özel dolgunuzu ayarlayın .

RadioButton'ın xml özelliği.

<RadioButton
    android:id="@+id/radHighest"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:button="@drawable/YourImageResource"
    android:drawablePadding="50dp"
    android:paddingLeft="10dip"
    android:text="@string/txt_my_text"
    android:textSize="12sp" />

Bitti


22

Aşağıdaki XML niteliklerini kullanın. Benim için çalıştı

API <= 16 için kullanım

android:paddingLeft="16dp"

API> = 17 için kullanım

android:paddingStart="@16dp"

Örneğin:

<android.support.v7.widget.AppCompatRadioButton
        android:id="@+id/popularityRadioButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:checked="true"
        android:paddingEnd="@dimen/radio_button_text"
        android:paddingLeft="@dimen/radio_button_text"
        android:paddingRight="@dimen/radio_button_text"
        android:paddingStart="@dimen/radio_button_text"
        android:text="Popularity"
        android:textSize="@dimen/sort_dialog_text_size"
        android:theme="@style/AppTheme.RadioButton" />

görüntü açıklamasını buraya girin

Dahası Daha fazlası: drawablePaddingöznitelik çalışmıyor. Yalnızca radyo düğmenize bir çekmece eklediyseniz çalışır. Örneğin:

<RadioButton
    android:id="@+id/radioButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:button="@null"
    android:drawableEnd="@android:drawable/btn_radio"
    android:drawablePadding="56dp"
    android:drawableRight="@android:drawable/btn_radio"
    android:text="New RadioButton" />

6

Bunu şu anda doğrulamak için deneyemezsiniz, ancak android: drawablePadding özelliğinin ihtiyacınız olanı yapıp yapmadığını görmeye çalıştınız mı?


1
Hm. Denedi ve bu durumda herhangi bir etkisi yok gibi görünüyor. Öneri için teşekkürler, kesinlikle açıklamadan geliyor: "Çekilebilir öğeler ve metin arasındaki dolgu".
allclaws

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

    checkBox.getPaddingTop(),
    checkBox.getPaddingRight(),
    checkBox.getPaddingBottom());

1

Çekilebilir öğeler ve metin arasındaki dolgu. Xml dosyasında aşağıdaki satırın eklenmesiyle sağlanacaktır. android:drawablePadding="@dimen/10dp"


tam olarak bunu arıyordum ... bana çok yardımcı oldu
Shirish Herwade

2
@dimen/10dpkötü antrenman
Vlad

0

Denedim, "android: paddingLeft" çalışacak. paddingLeft, radyo görüntüsünü orijinal konumunda tutarken yalnızca metni etkileyecektir.


-1

"Android: paddingLeft" yalnızca android 4.2.2 altında düzgün çalışıyor gibi görünüyor

android'in hemen hemen tüm sürümlerini denedim ve yalnızca 4.2.2 sürümünde çalışıyor.


-1

Tüm API sürümlerinde çalışması gerektiğini düşündüğüm farklı bir yaklaşım kullanıyorum. Dolgu uygulamak yerine RadioButtons'a boş bir görünüm ekliyorum:

<View
        android:layout_width="20dp"
        android:layout_height="1dp" />

Bu size 20dp dolgu vermelidir.


-1

Buraya bir cevap aramaya geldim ve en basit yol (biraz düşündükten sonra) etiketin başına böyle bir boşluk eklemekti

<RadioGroup
     android:orientation="horizontal"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignRight="@+id/btnChangeMode"
     android:layout_marginTop="10dp"
     android:layout_marginBottom="10dp"
     android:layout_below="@+id/view3"
     android:gravity="center|left"
     android:id="@+id/ledRadioGroup">
<RadioButton
         android:button="@drawable/custom_radio_button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text=" On"
         android:layout_marginRight="6dp"
         android:id="@+id/ledon"
         android:textColor="@color/white" />
<RadioButton
         android:button="@drawable/custom_radio_button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text=" Off"
         android:layout_marginLeft="6dp"
         android:id="@+id/ledoff"
         android:textColor="@color/white" />

-1

benim için çalışıyor:

<?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_checked="true">
            <layer-list>
                <item android:right="5dp">
                    <shape android:paddingLeft="5dp" android:shape="oval">
                     <size android:width="20dp" android:height="20dp" />
                     <solid android:color="@color/blue" />
            </shape>
        </item>
    </layer-list>
</item>
<item android:paddingLeft="5dp" android:state_checked="false">
    <layer-list>
        <item android:right="5dp">
            <shape android:paddingLeft="5dp" android:shape="oval">
                <size android:width="20dp" android:height="20dp" />
                <solid android:color="@color/grey" />
                </shape>
            </item>
        </layer-list>
    </item>
</selector>

-1
<RadioButton
                android:id="@+id/rb1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:background="@null"
                android:paddingLeft="20dp"
                android:text="1"
                android:textColor="@color/text2"
                android:textSize="16sp"
                android:textStyle="bold" />

Bunun sorunu nasıl
çözdüğünü

-1

Bu kodu XML dosyanızda yapabilirsiniz

<RadioButton
android:id="@+id/rButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="50dp"
android:paddingLeft="10dip"
android:text="@string/your_text" />

veya bunu Activity sınıfında kullanın

radioButton.setPadding(12, 10, 0, 10);

-1

Style.xml'de bunun gibi bir stil oluşturun

<style name="Button.Radio">

    <item name="android:paddingLeft">@dimen/spacing_large</item>
    <item name="android:textSize">16sp</item>
</style>

Bu stili radyo düğmesine koy

 <RadioButton
                android:id="@+id/rb_guest_busy"
                android:layout_width="match_parent"
                android:layout_height="48dp"
                android:text="@string/guest_is_waiting"
                android:textSize="@dimen/font_size_3x_medium"
                android:drawablePadding="@dimen/spacing_large"
                android:textColor="@color/color_text_heading_dark"
                style="@style/Button.Radio"/>

RadioButton'ın düğmeyi dolaylı olarak devraldığı gibi, düğmeyle aynı nitelikleri değiştirebilirsiniz.


-1

Bunun eski bir soru olduğunu biliyorum, ancak bu çözümle sonunda huzur buldum ve API seviyesini unuttum.

Sağ taraf dikey metin görünümüne sahip sol taraf dikey Radyo Grubu

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_vertical">
        <RadioButton
            android:id="@+id/radio1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <RadioButton
            android:id="@+id/radio2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </RadioGroup>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="8dp"
            android:gravity="center_vertical"
            android:text="Radio 1"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="8dp"
            android:gravity="center_vertical"
            android:text="Radio 2"/>
    </LinearLayout>
</LinearLayout>

@Mark Buikema, Kesinlikle etiket değil, ama burada etiket gibi çalışıyor! Tıklama etiketleri istiyorsanız, Metin Görünümlerine tıklama işleyicileri ekleyebilirsiniz. Demek istediğim, android işletim sisteminin her sürümü için düzen uygulamamız gerekiyor mu? Sanırım hayır.
Stanley Kou

-1

Radyo düğmesinin yerçekimi özelliğini kullanmayı deneyebilirsiniz.

<RadioButton
                        android:id="@+id/rb_all"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:checked="true"
                        android:gravity="right|center_vertical"
                        android:padding="@dimen/padding_30dp"
                        android:text="@string/filter_inv_all"
                        android:textColor="@color/black"
                        android:textSize="@dimen/text_size_18" />

Bu, metni en sağa hizalar. Resimdeki ilk radyoya bakın.

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.