Thêm lề giữa RadioButton và nhãn của nó trong Android?


88

Có thể thêm một chút không gian giữa RadioButton và nhãn trong khi vẫn sử dụng các thành phần tích hợp sẵn của Android không? Theo mặc định, văn bản trông hơi ngắn.

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

Tôi đã thử một vài thứ:

  1. Việc chỉ định lề và khoảng đệm dường như thêm không gian xung quanh toàn bộ phần tử (nút và văn bản, cùng nhau). Điều đó có lý, nhưng không làm được những gì tôi cần.

  2. Tạo một tệp có thể vẽ tùy chỉnh thông qua XML chỉ định hình ảnh cho các trạng thái đã chọn và chưa kiểm tra, sau đó thêm một vài pixel bổ sung vào bên phải của mỗi hình ảnh. Điều này sẽ hoạt động, nhưng bây giờ bạn đang bước ra ngoài giao diện người dùng mặc định. (Không phải ngày tận thế, nhưng cũng không phải lý tưởng)

  3. Thêm khoảng trắng bổ sung vào đầu mỗi nhãn. Android dường như cắt bớt một ký tự khoảng trắng ở đầu, như trong "Chuỗi của tôi", nhưng chỉ định unicode U + 00A0, như trong "\ u00A0My String" thực hiện được mẹo. Điều này có hiệu quả, nhưng nó có vẻ hơi bẩn.

Bất kỳ giải pháp tốt hơn?

Câu trả lời:


120

Đối với bất kỳ ai đang đọc điều này ngay bây giờ, câu trả lời được chấp nhận sẽ dẫn đến một số vấn đề về bố cục trên các API mới hơn gây ra quá nhiều đệm.

Trên API <= 16, bạn có thể đặt paddingLefttrên nút radio để đặt phần đệm so với giới hạn chế độ xem của nút radio. Ngoài ra, nền bản vá chín cũng thay đổi giới hạn chế độ xem so với chế độ xem.

Trên API> = 17, paddingLeft(hoặc paddingStart) liên quan đến nút radio có thể vẽ được. Tương tự áp dụng cho khoảng một bản vá chín. Để minh họa rõ hơn sự khác biệt về phần đệm, hãy xem ảnh chụp màn hình đính kèm.

Nếu bạn tìm hiểu mã, bạn sẽ tìm thấy một phương pháp mới trong API 17 được gọi là getHorizontalOffsetForDrawables . Phương pháp này được gọi khi tính toán khoảng đệm bên trái cho một nút radio (do đó không gian bổ sung được minh họa trong hình).

TL; DR Chỉ sử dụng paddingLeftnếu của bạn minSdkVersion> = 17. Nếu bạn hỗ trợ API <= 16, bạn nên có kiểu nút radio cho SDK tối thiểu mà bạn đang hỗ trợ và kiểu khác cho API 17+.

kết hợp ảnh chụp màn hình cho thấy sự khác biệt về phần đệm bên trái giữa các phiên bản API


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

11
Cách tốt nhất để làm điều này là với một thư mục "giá trị-v17"; đặt thứ nguyên API 17+ của bạn trong xml tài nguyên ở đó và thứ nguyên tiêu chuẩn cho 16 trở xuống chỉ bằng "giá trị" đơn giản.
akent

15
Thật ngạc nhiên khi các nhà phát triển / quản lý của Google đối xử với chúng tôi là những nhà phát triển bình thường. Họ làm bất cứ điều gì họ muốn, bất cứ khi nào họ muốn. Nhất quán và chính trực không có nghĩa lý gì đối với họ.
Yar

66

Không chắc liệu điều này có khắc phục được sự cố của bạn hay không, nhưng bạn đã thử thuộc tính "Padding left" của Radio Button với giá trị từ 50dip trở lên chưa


2
Điều này hoạt động và cần có 50dip để bao phủ chiều rộng của tệp có thể vẽ mặc định. Lúc đầu, tôi sử dụng 20dip và văn bản di chuyển sang trái! Đó là bởi vì điểm neo không phải là cạnh bên phải của ngăn kéo; nó là cạnh trái của cái có thể kéo được.
Robert Claypool

58

Tôi đã thử một số cách và kết thúc với cách này hoạt động chính xác trên cả trình giả lập và thiết bị:

    <RadioButton
        android:background="@android:color/transparent"
        android:button="@null"
        android:drawableLeft="@drawable/your_own_selector"
        android:drawablePadding="@dimen/your_spacing" />
  • android: nền cần phải trong suốt vì có vẻ như trên api10 có một nền với các phần đệm nội tại (không thử với các apis khác nhưng giải pháp cũng hoạt động trên các ứng dụng khác)
  • android: nút cần phải trống vì đệm sẽ không hoạt động chính xác nếu không
  • android: drawableLeft cần được chỉ định thay vì android: button
  • android: drawablePadding là không gian sẽ nằm giữa có thể vẽ và văn bản của bạn

4
Câu trả lời tốt nhất! Bạn cũng có thể đặt android: background = "@ null" và sẽ trông như bạn đã nêu mà không có phần đệm.
saiyancoder

2
khi tôi đang cài đặt android: button = "@ null", nút radio không được chọn (được nhấp vào). Tôi đang làm gì đó sai. xin vui lòng giúp đỡ stackoverflow.com/questions/28052820/...
Shirish Herwade

@Shirish giải pháp này không liên quan gì đến việc nút của bạn không được nhấp. Tôi vừa thực hiện nó và nó được nhấp vào.
Yar

Cảm ơn vì giải pháp!
Vimalathithan Rajasekaran

32

Thêm lề giữa một RadioButton của nhãn bởi paddingLeft :

android:paddingLeft="10dip"

Chỉ cần đặt đệm tùy chỉnh của bạn .

Thuộc tính xml của RadioButton.

<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" />

Làm xong


22

Sử dụng các thuộc tính XML sau. Nó đã làm việc cho tôi

Đối với API <= 16 sử dụng

android:paddingLeft="16dp"

Đối với API> = 17 sử dụng

android:paddingStart="@16dp"

Ví dụ:

<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" />

nhập mô tả hình ảnh ở đây

Thêm nữa: drawablePaddingthuộc tính không hoạt động. Nó chỉ hoạt động nếu bạn thêm một biểu tượng có thể kéo vào trong nút radio của mình. Ví dụ:

<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

Không thể thử điều này ngay bây giờ để xác minh, nhưng bạn đã thử xem thuộc tính android: drawablePadding có những gì bạn cần không?


1
Hừm. Đã thử và nó dường như không có bất kỳ tác dụng nào trong tình huống này. Cảm ơn gợi ý, chắc chắn nghe đúng từ mô tả: "Khoảng đệm giữa các ngăn kéo và văn bản".
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

Phần đệm giữa các phần có thể kéo và văn bản. Nó sẽ đạt được bằng cách thêm dòng bên dưới trong tệp xml. android:drawablePadding="@dimen/10dp"


tôi đã tìm kiếm chính xác điều này ... đã giúp tôi rất nhiều
Shirish Herwade

2
@dimen/10dpthực hành xấu
Vlad

0

Tôi đã thử, "android: paddingLeft" sẽ hoạt động. paddingLeft sẽ chỉ tác động đến văn bản trong khi giữ hình ảnh radio ở vị trí ban đầu.


-1

"Android: paddingLeft" dường như chỉ hoạt động bình thường trong android 4.2.2

Tôi đã thử hầu hết các phiên bản của Android và nó chỉ hoạt động trên phiên bản 4.2.2.


-1

Tôi đang sử dụng cách tiếp cận khác mà tôi nghĩ sẽ hoạt động trên tất cả các phiên bản API. Thay vì áp dụng đệm, tôi đang thêm một chế độ xem trống giữa RadioButtons:

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

Điều này sẽ cung cấp cho bạn đệm 20dp.


-1

Tôi đến đây để tìm câu trả lời và cách đơn giản nhất (sau khi suy nghĩ) là thêm khoảng cách vào đầu nhãn như vậy

<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

đối với tôi hoạt động:

<?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" />

Hãy xem xét thêm một số ý kiến để giải thích cách này giải quyết vấn đề;)
DeadlyJesus

-1

Bạn có thể viết mã này trên tệp XML của mình

<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" />

hoặc sử dụng cái này trên lớp Hoạt động

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

-1

Tạo kiểu trong style.xml như thế này

<style name="Button.Radio">

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

Đặt phong cách đó vào nút radio

 <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"/>

Bạn có thể thay đổi bất kỳ thuộc tính nào giống như nút vì nó là nút kế thừa gián tiếp RadioButton.


-1

Tôi biết đó là một câu hỏi cũ, nhưng với giải pháp này, cuối cùng tôi đã yên tâm và quên đi cấp API.

RadioGroup dọc bên trái với chế độ xem văn bản dọc bên phải.

 <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, Hoàn toàn nó không phải là nhãn, nhưng nó hoạt động giống như nhãn ở đây! Nếu bạn muốn có nhãn nhấp chuột, bạn có thể thêm trình nghe nhấp chuột vào TextViews. Quan điểm của tôi là, chúng ta có cần phải triển khai bố cục cho mọi phiên bản của hệ điều hành android không? Tôi nghĩ không có.
Stanley Kou

-1

Bạn có thể thử sử dụng thuộc tính trọng lực của nút radio.

<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" />

Điều này sẽ căn chỉnh văn bản ở cuối bên phải. Kiểm tra đài phát thanh đầu tiên trong hình ảnh.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.