Android - ช่องว่างระหว่างช่องทำเครื่องหมายและข้อความ


256

มีวิธีง่าย ๆ ในการเพิ่มช่องว่างภายในช่องทำเครื่องหมายในตัวควบคุมกล่องกาเครื่องหมายและข้อความที่เกี่ยวข้อง?

ฉันไม่สามารถเพิ่มช่องว่างนำหน้าได้เพราะป้ายกำกับของฉันเป็นหลายบรรทัด

ตามที่เป็นอยู่ข้อความอยู่ใกล้กับช่องทำเครื่องหมายมากเกินไป: ข้อความแสดงแทน


1
วิธีแก้ปัญหาอย่างง่าย ๆ ก็คือการใช้TextViewกับdrawableLeftและใช้drawablePaddingเพื่อให้พื้นที่กับข้อความ ในรหัสเพียงสลับสถานะที่เลือกและไม่ได้เลือกไว้
มูฮัมหมัดบาบาร์

ฉันเพิ่งสังเกตเห็นแอตทริบิวต์ xml ใหม่ที่เรียกว่า android: drawablePadding ซึ่งควรกำหนดระยะห่างระหว่าง drawable และข้อความ ฉันไม่ได้ลอง แต่ฉันคิดว่านี่เป็นวิธีแก้ปัญหา "after-the-fact" ของ Google สำหรับปัญหานี้
Peri Hartman

คำตอบ:


333

ฉันเกลียดที่จะตอบคำถามของตัวเอง แต่ในกรณีนี้ฉันคิดว่าฉันต้อง หลังจากตรวจสอบมันออกมา @Falmarri อยู่ในเส้นทางที่ถูกต้องพร้อมกับคำตอบของเขา ปัญหาคือตัวควบคุมกล่องกาเครื่องหมายของ Android ใช้คุณสมบัติ android: paddingLeft แล้วเพื่อรับข้อความที่อยู่

เส้นสีแดงแสดงค่าการชดเชย paddingLeft ของช่องทำเครื่องหมายทั้งหมด

ข้อความแสดงแทน

หากฉันลบล้างการแพ็ดทับในเลย์เอาต์ XML ของฉันมันจะทำให้เลย์เอาต์เสียหาย นี่คือสิ่งที่การตั้งค่า paddingLeft = "0" ทำ:

ข้อความแสดงแทน

ปรากฎว่าคุณไม่สามารถแก้ไขได้ใน XML คุณได้ทำมันในรหัส ต่อไปนี้เป็นตัวอย่างข้อมูลของฉันที่เพิ่มการแพ็ดแบบฮาร์ดโค้ดที่ 10dp

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

นี่จะให้สิ่งต่อไปนี้แก่คุณโดยที่เส้นสีเขียวคือการเพิ่มช่องว่างภายใน สิ่งนี้ปลอดภัยกว่าการเข้ารหัสค่าเนื่องจากอุปกรณ์ต่าง ๆ สามารถใช้ drawables ที่แตกต่างกันสำหรับช่องทำเครื่องหมาย

ข้อความแสดงแทน

อัปเดต - ตามที่ผู้คนได้กล่าวถึงเมื่อเร็ว ๆ นี้ในคำตอบด้านล่างพฤติกรรมนี้มีการเปลี่ยนแปลงอย่างเห็นได้ชัดใน Jelly Bean (4.2) แอปของคุณจะต้องตรวจสอบเวอร์ชันที่ใช้งานอยู่และใช้วิธีการที่เหมาะสม

สำหรับ 4.3+ เพียงแค่ตั้งค่า padding_left ดูคำตอบของ htafoya สำหรับรายละเอียด


108
ไม่มีอะไรผิดปกติในการตอบคำถามของคุณ - คนอื่นอาจจะมีปัญหานี้ในอนาคตและคุณเพิ่งได้รับคำตอบที่ดีและครอบคลุม
AndrewKS

4
มีอะไรผิดปกติกับการตั้งค่าเพียงpaddingLeft="48sp"? ทำงานได้ดีที่นี่แม้ว่าฉันจะเปลี่ยนขนาดและการวางแนว รหัสของคุณให้ค่าแพ็ดดิ้งที่ผิดปกติให้ฉันมากกว่ารายการ
harpo

5
@harpo - คุณไม่รับประกันว่าผู้ผลิตอุปกรณ์ที่แตกต่างกันจะไม่ใช้กราฟิกที่แตกต่างกันสำหรับช่องทำเครื่องหมายหมายถึงช่องว่างภายในที่เข้ารหัสยากของคุณอาจทำลายรูปแบบภาพของคุณบนอุปกรณ์ที่แตกต่างกัน เนื่องจากฉันกำลังอ่านช่องว่างภายในปัจจุบันและเพิ่มไปที่นั่นจะไม่เป็นปัญหา แต่คุณต้องให้แน่ใจว่าคุณทำเพียงครั้งเดียว
DougW

2
@Blundell - ไม่จำเป็น โอเพ่นซอร์สของ Android ผู้จำหน่ายอุปกรณ์สามารถทดแทนกราฟิกที่แตกต่างโดยสิ้นเชิงด้วยขนาดที่แตกต่างกันโดยสิ้นเชิง พวกเขาชอบทำสิ่งเช่นนั้นด้วยเหตุผลบางอย่าง
DougW

2
น่าเสียดายที่คุณไม่สามารถใช้โซลูชันนี้ในgetView()อะแดปเตอร์ที่กำหนดเอง (ถ้าคุณรีไซเคิลมุมมองของคุณ) เนื่องจากการแพ็ดดิ้งจะเพิ่มขึ้นอย่างไม่มีที่สิ้นสุด 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); }เพื่อแก้ไขปัญหานี้ผมต้องใช้อะไรเช่นนี้ และจากนั้นใช้PADDINGสำหรับทุกช่องทำเครื่องหมายฉันขยาย:check.setPadding(PADDING, check.getPaddingTop() ...
อเล็กซ์ Semeniuk

133

เมื่อได้รับการตอบสนอง @DougW สิ่งที่ฉันทำเพื่อจัดการเวอร์ชันนั้นง่ายกว่าฉันเพิ่มในมุมมองกล่องกาเครื่องหมายของฉัน:

android:paddingLeft="@dimen/padding_checkbox"

ตำแหน่งที่พบ dimen ในสองโฟลเดอร์ค่า:

ค่า

<resources>

    <dimen name="padding_checkbox">0dp</dimen>

</resources>

values-v17 (4.2 JellyBean)

<resources>

    <dimen name="padding_checkbox">10dp</dimen>

</resources>

ฉันมีการตรวจสอบที่กำหนดเองใช้ dps เพื่อเลือกที่ดีที่สุดของคุณ


2
นี่คือคำตอบที่ดีที่สุด แม้ว่าจริงๆมันควรจะเป็นvalues-v17ทั้งแก้ไขเป็นที่รู้จักใน API 17 (ตามโพสต์บางด้านบน)
icecreamman

คำตอบที่สมบูรณ์แบบสำหรับ apis ที่เก่ากว่า (ค่า / dimens) ฉันตั้ง padding_checkbox เป็น 0dip (บน API 10 margin นั้นมีขนาดใหญ่มากแล้ว) และสำหรับค่า -v17 10dip ตามที่แนะนำ htafoya
Yar

70

ใช้แอตทริบิวต์แทนandroid:drawableLeft android:buttonเพื่อที่จะตั้ง padding android:drawablePaddingระหว่างการใช้ android:paddingLeftการวางตำแหน่งการใช้ drawable

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

ผลลัพธ์


1
สวัสดีนี่เป็นวิธีที่ดี แต่โปรดสังเกตว่าคุณจะได้รับขอบซ้ายพิเศษ bcoz ของภาพเริ่มต้นของช่องทำเครื่องหมาย .. วิธีแก้ปัญหาใด ๆ ที่
Code_Life

4
กำหนดandroid:background="@android:color/transparent"และขอบด้านซ้ายจะหายไป
madeuz

2
รหัสด้านบนทำงานได้อย่างสมบูรณ์แบบสำหรับปุ่มตัวเลือกของฉันและสอดคล้องกับขอบเขตของระบบปฏิบัติการ 4.2 ขอบคุณ!
gnichola

1
สิ่งนี้ควรอยู่ในอันดับที่สูงกว่ามาก ดังที่ @gnichola กล่าวว่าสิ่งนี้ใช้ได้กับรุ่น Android และเป็นโซลูชั่นที่ค่อนข้างสะอาด สร้างสไตล์และกำหนดในธีมของคุณดังนี้: <item name="android:checkboxStyle">@style/CheckBox</item> ด้วยวิธีนี้คุณกำหนดสไตล์ไว้หนึ่งครั้งและอ้างอิงเพียงครั้งเดียว
Rosomack

1
ตั้งค่าพื้นหลังเป็น null (หรือกำหนดเองบางอย่าง) มิฉะนั้น lollipop + จะได้รับเอฟเฟกต์ระลอกคลื่นวงกลมขนาดใหญ่ที่ล้อมรอบมุมมองทั้งหมด คุณสามารถใช้ปุ่ม v21 drawable โดยใช้แท็ก <ripple> เพื่อใส่ระลอกที่เหมาะสมยิ่งขึ้นกลับมา
Tom

34

Android 4.2 Jelly Bean (API 17) วางข้อความเป็นส่วนขยายจาก buttonDrawable (ints right edge edge) มันยังใช้งานได้กับโหมด RTL

ก่อนที่ 4.2 paddingLeft ละเว้นปุ่มกดวาดได้ - ถูกนำมาจากขอบด้านซ้ายของมุมมอง CompoundButton

คุณสามารถแก้ปัญหาได้ผ่านทาง XML - ตั้งค่า paddingLeft เป็น buttonDrawable.width + requiredSpace บน Android ที่เก่ากว่า ตั้งค่าเป็น RequiredSpace บน API 17 ขึ้นไปเท่านั้น ตัวอย่างเช่นใช้ทรัพยากรมิติและแทนที่ในโฟลเดอร์ทรัพยากร values-v17

การเปลี่ยนแปลงถูกนำเสนอผ่าน android.widget.CompoundButton.getCompoundPaddingLeft ();


4
นี่เป็นคำตอบเดียวที่ถูกต้องที่นี่ - ระบุปัญหาและให้คำตอบง่ายๆซึ่งฉันใช้ในแอพเชิงพาณิชย์หลาย ๆ ตัวประสบความสำเร็จ
Madej

1
คุณจะได้รับ buttonDrawable.width ใน XML หรือคุณรหัสยากหรือไม่
Jared Kells

1
android:background="@android:color/transparent"ฉันจัดการเพื่อแก้ไขปัญหานี้ในรหัสเดิมโดยการเอา
Sebek

คำตอบที่ยอมรับนั้นดีและทำงานได้ แต่คำตอบนี้ง่ายและมีประสิทธิภาพ คำตอบนี้ควรได้รับการยอมรับ
Reaz Murshed

27

ใช่คุณสามารถเพิ่มช่องว่างภายในได้โดยการเพิ่มช่องว่างภายใน

android:padding=5dp


4
ใช้งานได้จริง ... เรียงลำดับจาก สำหรับหนึ่งต้องใช้เฉพาะการขยายซ้ายเท่านั้นไม่ใช่การเสริมเต็มทั้งหมด อย่างไรก็ตามดูเหมือนว่า paddingLeft ได้ตั้งค่าไว้ที่ประมาณ 40dp แล้ว หากฉันตั้งค่า> 40dp มันจะเคลื่อนที่ไปหากฉันตั้งไว้ <40dp จะเคลื่อนที่ไปใต้ช่องทำเครื่องหมาย ฉันจะทำเครื่องหมายว่าถูกต้องและเปิดคำถามอื่นเพราะฉันมีความกังวลเกี่ยวกับเรื่องนั้น
DougW

ฉันไม่มีความคิดเลยถ้าไม่เห็นเลย์เอาต์ของคุณ
Falmarri

ใช่ไม่ทำงาน .. โดยเฉพาะอุปกรณ์ซัมซุงที่ฉันมีปัญหา
Ranjith Kumar

1
เพิ่มช่องว่างภายในโดยการเพิ่มช่องว่างภายในดูดี!
Sermilion

21

หากคุณต้องการการออกแบบที่ไม่มีรหัสให้ใช้:

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

เคล็ดลับคือการตั้งค่าสีที่จะโปร่งใสและกำหนดค่าสำหรับandroid:drawableLeft android:drawablePaddingนอกจากนี้ความโปร่งใสยังช่วยให้คุณสามารถใช้เทคนิคนี้กับสีพื้นหลังใด ๆ โดยไม่มีผลข้างเคียงเช่นสีไม่ตรงกัน


16

API 17 ขึ้นไปคุณสามารถใช้:

หุ่นยนต์: paddingStart = "24dp"

API 16 และต่ำกว่าคุณสามารถใช้:

หุ่นยนต์: paddingLeft = "24dp"


1
คำตอบที่ดีมาก ฉันไม่สามารถจินตนาการได้ว่าช่องว่างภายในจะให้ช่องว่างระหว่างกล่องกาเครื่องหมายและข้อความได้อย่างไร โดยปกติแล้วการเสริมทางซ้ายหมายถึงด้านซ้ายของส่วนประกอบ
Mohamed Ibrahim

14

ในกรณีของฉันฉันแก้ไขปัญหานี้โดยใช้คุณสมบัติ CheckBox ต่อไปนี้ใน XML:

* * * *

หุ่นยนต์: paddingLeft = "@ dimen / activity_horizontal_margin"

* * * *


คำตอบที่ดีมาก ฉันไม่สามารถจินตนาการได้ว่าช่องว่างภายในจะให้ช่องว่างระหว่างกล่องกาเครื่องหมายและข้อความได้อย่างไร โดยปกติแล้วการเสริมทางซ้ายหมายถึงด้านซ้ายของส่วนประกอบ
โมฮาเหม็ดอิบราฮิม

13

วิธีง่ายๆเพิ่มบรรทัดนี้ในคุณสมบัติกล่องกาเครื่องหมายแทนที่10dpด้วยค่าระยะห่างที่คุณต้องการ

android:paddingLeft="10dp"

10

ฉันไม่รู้จักพวก แต่ได้ทำการทดสอบ

<CheckBox android:paddingLeft="8mm" และย้ายข้อความไปทางขวาไม่ใช่การควบคุมทั้งหมด

มันเหมาะกับฉันดี


1
ฉันไม่ได้ลองสิ่งนี้เมื่อเร็ว ๆ นี้ดังนั้นจึงเป็นไปได้อย่างแน่นอนว่าจะใช้งานได้บนอุปกรณ์เฉพาะหรือเวอร์ชัน Android OS ที่ใหม่กว่า ฉันขอแนะนำอย่างยิ่งให้คุณทดสอบการตั้งค่าที่แตกต่างกัน แต่เนื่องจากนี่ไม่ได้ผลในขณะที่ฉันถามคำถามนี้
DougW

ฉันเห็นว่าพฤติกรรมนี้แตกต่างกันระหว่าง 2.3.3 และ 4.2 (ไม่แน่ใจว่าเกิดขึ้นที่ใดในระหว่างการเปลี่ยนแปลง)
เนท

คุณหมายถึง dp ไม่ใช่ mm ใช่ไหม
Chrispix

10

ทำไมไม่ขยายแอนดรอยด์เช็คบ็อกซ์ของ Android ให้ดีขึ้นแทน ด้วยวิธีนี้แทนที่จะต้องแก้ไขในรหัสทุกครั้งที่คุณใช้กล่องกาเครื่องหมายคุณสามารถใช้กล่องกาเครื่องหมายคงที่แทน

กล่องกาเครื่องหมายขยายแรก:

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));
    }
}

อันดับที่สองใน xml ของคุณแทนที่จะสร้างเช็กบ็อกซ์ปกติสร้างส่วนขยายของคุณ

<com.whatever.CheckBoxWithPaddingFix
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello there" />

2
คุณควรเพิ่ม 'ถ้า' เพื่อหลีกเลี่ยงการทำเช่นนั้นหากระบบปฏิบัติการ> 4.2 เพราะใน Jelly Bean พวกเขา "แก้ไข" สิ่งนี้
Martin Marconcini

1
จริง> = 4.2 (17)
Aleks N.

6

ฉันเพิ่งสรุปเกี่ยวกับเรื่องนี้:

แทนที่ช่องทำเครื่องหมายและเพิ่มวิธีนี้ถ้าคุณมี 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;
    }

}

หรือสิ่งนี้ถ้าคุณใช้ระบบ 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;
    }

}

ขอบคุณสำหรับคำตอบ :)


4

พฤติกรรมนี้มีการเปลี่ยนแปลงใน Jelly Bean เคล็ดลับ paddingLeft เพิ่มช่องว่างภายในเพิ่มเติมทำให้ข้อความดูขวาเกินไป มีใครสังเกตเห็นอีกไหม?


ขอบคุณสำหรับการอัพเดท! ฉันได้เพิ่มบันทึกย่อไปยังคำตอบของฉันเกี่ยวกับเรื่องนี้
DougW

4

สำหรับช่องว่างระหว่างเครื่องหมายถูกกับการใช้ข้อความ:

android:paddingLeft="10dp"

แต่มันจะกลายเป็นมากกว่า 10dp เพราะเครื่องหมายถูกบรรจุรอบ (ประมาณ 5dp) หากคุณต้องการลบการแพ็ดดูที่วิธีการลบการแพ็ดเดิ้ลรอบกล่องกาเครื่องหมาย Android :

android:paddingLeft="-5dp"
android:layout_marginStart="-5dp"
android:layout_marginLeft="-5dp"
// or android:translationX="-5dp" instead of layout_marginLeft

2
<CheckBox
        android:paddingRight="12dip" />

@AndrewKS - ผ่านการทดสอบแล้ว ตามที่คาดไว้สิ่งนี้จะเพิ่มการขยายไปยังตัวควบคุมทั้งหมดไม่ใช่ระหว่างช่องทำเครื่องหมายและข้อความ
DougW

คุณน่าจะดีกว่าถ้ามีข้อความใน TextView แยกต่างหาก
AndrewKS

@AndrewKS - ความคิดที่ดีสำหรับการใช้งาน ฉันต้องการให้ผู้ใช้สามารถสัมผัสข้อความและเลือก / ยกเลิกการเลือกช่องทำเครื่องหมาย นอกจากนี้ยังแบ่งคุณลักษณะการช่วยสำหรับการเข้าถึงมากมายเช่นเดียวกับที่คุณทำในเว็บเพจ
DougW

Bad idea for usabilityไม่มันไม่ใช่. ใส่ทั้งช่องทำเครื่องหมายและมุมมองข้อความในรูปแบบเชิงเส้นและทำให้ linearlayout สามารถสัมผัสได้
Falmarri

1
-1 คำตอบนี้ไม่ได้แก้ไขปัญหาที่เกิดในคำถามซึ่งเป็นเรื่องเกี่ยวกับช่องว่างระหว่างภาพและข้อความ
เดวิดแลง

2

หากคุณมีตัวเลือกภาพที่กำหนดเองสำหรับช่องทำเครื่องหมายหรือ RadioButton คุณต้องตั้งค่าคุณสมบัติปุ่มและพื้นหลังเช่นนี้:

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

คุณสามารถควบคุมขนาดของช่องทำเครื่องหมายหรือช่องว่างภายในปุ่มด้วยคุณสมบัติพื้นหลัง


ไม่คุณไม่ต้องทำเช่นนี้ สิ่งนี้ไม่เป็นที่ยอมรับหากคุณมีพื้นหลังที่กำหนดเองซึ่งแตกต่างจากกล่องกาเครื่องหมาย / radiobutton glyph
andr

2

คุณเท่านั้นที่จะต้องมีหนึ่งพารามิเตอร์ในไฟล์ xml

android:paddingLeft="20dp"

2

การตั้งค่า minHeight และ minWidth 0dpเป็นโซลูชันที่สะอาดและตรงที่สุดสำหรับฉันใน Android 9 API 28:

<CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="0dp"
        android:minWidth="0dp" />

1

หากคุณกำลังสร้างปุ่มที่กำหนดเองเช่นดูการเปลี่ยนรูปแบบของช่องทำเครื่องหมายบทช่วยสอน

จากนั้นเพิ่มความกว้างของ btn_check_label_background.9.png โดยเพิ่มคอลัมน์พิกเซลโปร่งใสหนึ่งหรือสองคอลัมน์ที่กึ่งกลางภาพ ปล่อยเครื่องหมาย 9 แพทช์ตามที่เป็น


1

สิ่งที่ฉันได้จะมีTextViewและCheckBoxภายใน Layout(ญาติ) TextViewแสดงข้อความที่ผมต้องการให้ผู้ใช้เห็นและCheckBoxไม่ได้มีข้อความใด ๆ ด้วยวิธีนี้ฉันสามารถกำหนดตำแหน่ง / ระยะห่างจากที่CheckBoxใดก็ได้ที่ฉันต้องการ


1

ฉันมีปัญหาเดียวกันกับ Galaxy S3 mini (android 4.1.2) และฉันได้ทำช่องทำเครื่องหมายที่กำหนดเองของฉันขยายAppCompatCheckBox แทน CheckBox ตอนนี้มันทำงานได้อย่างสมบูรณ์


0

คุณต้องมีขนาดของภาพที่คุณใช้เพื่อเพิ่มการเพิ่มขนาดนี้ ใน internals Android พวกเขาจะได้รับ drawable ที่คุณระบุใน src และใช้ขนาดของมันในภายหลัง เนื่องจากเป็นตัวแปรส่วนตัวและไม่มีผู้ให้บริการคุณจึงไม่สามารถเข้าถึงได้ นอกจากนี้คุณไม่สามารถรับ com.android.internal.R.styleable.CompoundButton และรับ drawable จากตรงนั้น

ดังนั้นคุณต้องสร้างสไตล์ของคุณเอง (เช่น custom_src) หรือคุณสามารถเพิ่มมันได้โดยตรงในการใช้งาน 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;
    }
}

0

ในขณะที่คุณอาจใช้ตัวเลือก drawable สำหรับandroid:buttonคุณสมบัติของคุณคุณต้องเพิ่มandroid:constantSize="true"และ / หรือระบุ drawable เริ่มต้นเช่นนี้:

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

หลังจากนั้นคุณต้องระบุandroid:paddingLeftแอตทริบิวต์ในช่องทำเครื่องหมาย xml ของคุณ

จุดด้อย:

ในเครื่องมือแก้ไขเลย์เอาต์คุณจะเห็นข้อความที่อยู่ใต้ช่องทำเครื่องหมายด้วย api 16 และด้านล่างในกรณีนี้คุณสามารถแก้ไขได้โดยสร้างคลาสของช่องทำเครื่องหมายที่คุณกำหนดเองตามที่แนะนำแต่สำหรับ api ระดับ 16

เหตุผล:

เป็นบั๊กเนื่องจากการStateListDrawable#getIntrinsicWidth()โทรถูกใช้ภายในCompoundButtonแต่อาจส่งคืน< 0ค่าหากไม่มีสถานะปัจจุบันและไม่มีการใช้ขนาดคงที่


0

ทั้งหมดที่คุณต้องทำเพื่อเอาชนะปัญหานี้คือการเพิ่มandroid:singleLine="true"ไปcheckBoxในรูปแบบ XML ของคุณหุ่นยนต์:

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

และไม่มีอะไรพิเศษจะถูกเพิ่มโดยทางโปรแกรม


0

ภาพเช็คบ็อกซ์ซ้อนทับกันเมื่อฉันใช้ drawables ของฉันเองจากตัวเลือกฉันแก้ปัญหานี้โดยใช้โค้ดด้านล่าง:

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);

ขอบคุณ Alex Semeniuk


0

ฉันจบลงด้วยปัญหานี้ด้วยการเปลี่ยนภาพ เพิ่งเพิ่มพื้นหลังโปร่งใสพิเศษในไฟล์ png โซลูชันนี้ใช้งานได้ดีเยี่ยมกับ API ทั้งหมด


0

อาจจะช้า แต่ฉันได้สร้างวิธีการอรรถประโยชน์เพื่อจัดการปัญหานี้

เพียงเพิ่มวิธีการนี้ในอุปกรณ์ของคุณ:

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());
}

และใช้ดังนี้:

    ViewUtils.setCheckBoxOffset(mAgreeTerms, R.dimen.space_medium);

หรือเช่นนี้

    // Be careful with this usage, because it sets padding in pixels, not in dp!
    ViewUtils.setCheckBoxOffsetPx(mAgreeTerms, 100f);

-1

แทนที่จะปรับข้อความสำหรับช่องทำเครื่องหมายฉันได้ทำสิ่งต่อไปนี้และมันทำงานกับฉันสำหรับอุปกรณ์ทั้งหมด 1) ใน XML เพิ่มช่องทำเครื่องหมายและมุมมองข้อความที่อยู่ติดกับคนอื่น; รักษาระยะห่าง 2) ตั้งค่าขนาดช่องข้อความเป็น 0sp 3) เพิ่มข้อความที่เกี่ยวข้องกับมุมมองข้อความนั้นถัดจากช่องทำเครื่องหมาย


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.