क्या चेकबॉक्स नियंत्रण और संबंधित पाठ में चेकबॉक्स के बीच पैडिंग जोड़ने का एक आसान तरीका है?
मैं सिर्फ अग्रणी स्थान नहीं जोड़ सकता, क्योंकि मेरा लेबल बहु-पंक्ति है।
जैसा कि, पाठ चेकबॉक्स के बहुत करीब है:
क्या चेकबॉक्स नियंत्रण और संबंधित पाठ में चेकबॉक्स के बीच पैडिंग जोड़ने का एक आसान तरीका है?
मैं सिर्फ अग्रणी स्थान नहीं जोड़ सकता, क्योंकि मेरा लेबल बहु-पंक्ति है।
जैसा कि, पाठ चेकबॉक्स के बहुत करीब है:
जवाबों:
मुझे अपने ही सवाल का जवाब देने से नफरत है, लेकिन इस मामले में मुझे लगता है कि मुझे इसकी जरूरत है। इसकी जाँच करने के बाद, @Falmarri अपने जवाब के साथ सही रास्ते पर था। समस्या यह है कि एंड्रॉइड का चेकबॉक्स नियंत्रण पहले से ही एंड्रॉइड का उपयोग करता है: पाठ को प्राप्त करने के लिए पेडिंग लाईट संपत्ति जहां वह है।
लाल रेखा पूरे चेकबॉक्स का पेडिंग लाईट ऑफसेट मान दिखाती है
यदि मैं अपने 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());
यह आपको निम्नलिखित देता है, जहां पेडिंग में ग्रीन लाइन वृद्धि है। यह मान को हार्डकोड करने से अधिक सुरक्षित है, क्योंकि विभिन्न डिवाइस चेकबॉक्स के लिए अलग-अलग ड्रॉबल्स का उपयोग कर सकते हैं।
अद्यतन - जैसा कि लोगों ने हाल ही में नीचे दिए गए उत्तरों में उल्लेख किया है, यह व्यवहार स्पष्ट रूप से जेली बीन (4.2) में बदल गया है। आपके ऐप को यह जांचना होगा कि कौन सा संस्करण चालू है, और उपयुक्त विधि का उपयोग करें।
4.3+ के लिए यह बस पेडिंग_लिफ्ट सेट कर रहा है। विवरण के लिए htafoya का उत्तर देखें।
paddingLeft="48sp"
? यहाँ ठीक काम करता है, भले ही मैं पैमाने और अभिविन्यास को बदल दूं। आपके कोड ने मुझे आइटमों की सूची में अनियमित गद्दी मान दिया।
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() ...
@DougW की प्रतिक्रिया को देखते हुए, मैं संस्करण को प्रबंधित करने के लिए क्या करता हूं, सरल है, मैं अपने चेकबॉक्स दृश्य में जोड़ता हूं:
android:paddingLeft="@dimen/padding_checkbox"
जहाँ डिमेन दो मान फ़ोल्डर में पाया जाता है:
मान
<resources>
<dimen name="padding_checkbox">0dp</dimen>
</resources>
मान- v17 (4.2 जेलीबीन)
<resources>
<dimen name="padding_checkbox">10dp</dimen>
</resources>
मेरे पास एक कस्टम चेक है, अपने सबसे अच्छे विकल्प के लिए डीपीएस का उपयोग करें।
values-v17
जैसा कि एपीआई 17 में ठीक किया गया था (ऊपर कुछ पदों के अनुसार)
के android:drawableLeft
बजाय विशेषता का उपयोग करें android:button
। ड्रा करने योग्य और पाठ उपयोग के बीच पैडिंग सेट करने के लिए android:drawablePadding
। ड्रा करने योग्य उपयोग की स्थिति के लिए android:paddingLeft
।
<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"
/>
android:background="@android:color/transparent"
और बायाँ मार्जिन गायब हो जाएगा
<item name="android:checkboxStyle">@style/CheckBox</item>
इस तरह, आपके पास एक बार परिभाषित शैली है और केवल एक बार संदर्भित है।
एंड्रॉइड 4.2 जेली बीन (एपीआई 17) बटन से टेक्स्ट पेडिंगटेफ्ट को डाल देता है (टिकाऊ दाएं किनारे)। यह RTL मोड के लिए भी काम करता है।
4.2 पेडिंग लाईट से पहले बटन को अनदेखा किया जा रहा था - यह कंपाउंडबटन के बाएं किनारे से लिया गया था।
आप इसे XML के जरिए हल कर सकते हैं - पुराने एंड्रॉइड पर padDLeft से बटन पर क्लिक करें। इसे केवल एपीआई 17 अप पर आवश्यक स्थानों पर सेट करें। उदाहरण के लिए, आयाम संसाधनों का उपयोग करें और मान-v17 संसाधन फ़ोल्डर में ओवरराइड करें।
परिवर्तन android.widget.CompoundButton.getCompoundPaddingLeft () के माध्यम से पेश किया गया था;
android:background="@android:color/transparent"
।
हां, आप पेडिंग जोड़कर पैडिंग कर सकते हैं।
android:padding=5dp
यदि आप कोड के बिना एक साफ डिजाइन चाहते हैं, तो उपयोग करें:
<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
। इसके अलावा, पारदर्शिता आपको साइड इफेक्ट के बिना किसी भी पृष्ठभूमि रंग पर इस तकनीक का उपयोग करने की अनुमति देती है - जैसे कि रंग बेमेल।
एपीआई 17 और इसके बाद के संस्करण, आप उपयोग कर सकते हैं:
एंड्रॉयड: paddingStart = "24dp"
एपीआई 16 और नीचे, आप उपयोग कर सकते हैं:
एंड्रॉयड: paddingLeft = "24dp"
मेरे मामले में मैंने XML में निम्न चेकबॉक्स विशेषता का उपयोग करके इस समस्या को हल किया:
*
एंड्रॉयड: paddingLeft = "@ Dimen / activity_horizontal_margin"
*
सरल समाधान, चेकबॉक्स गुणों में इस पंक्ति को जोड़ें , अपने इच्छित रिक्ति मूल्य के साथ 10dp बदलें
android:paddingLeft="10dp"
मैं लोगों को नहीं जानता, लेकिन मैंने परीक्षण किया
<CheckBox android:paddingLeft="8mm"
और केवल पाठ को दाईं ओर ले जाता है, संपूर्ण नियंत्रण नहीं।
यह मुझे ठीक लगता है।
इसके बजाय बेहतर पैडिंग करने के लिए एंड्रॉइड चेकबॉक्स का विस्तार क्यों न करें। चेकबॉक्स का उपयोग करने के बाद हर बार कोड में इसे ठीक करने के बजाय आप इसके बजाय निश्चित चेकबॉक्स का उपयोग कर सकते हैं।
पहला चेकबॉक्स बढ़ाएँ:
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" />
मैंने अभी इस पर निष्कर्ष निकाला है:
चेकबॉक्स को ओवरराइड करें और यदि आपके पास एक कस्टम ड्राअबल है तो इस विधि को जोड़ें:
@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;
}
}
या यदि आप सिस्टम का उपयोग करने योग्य हैं:
@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;
}
}
जवाब के लिए धन्यवाद :)
यह व्यवहार जेली बीन में बदला हुआ प्रतीत होता है। पेडिंग लाईट ट्रिक अतिरिक्त पैडिंग जोड़ता है, जिससे टेक्स्ट बहुत दूर सही दिखता है। किसी और को नोटिस?
चेक मार्क और टेक्स्ट उपयोग के बीच की जगह के लिए:
android:paddingLeft="10dp"
लेकिन यह 10dp से अधिक हो जाता है, क्योंकि चेक मार्क में पैडिंग (लगभग 5dp) होता है। यदि आप पैडिंग निकालना चाहते हैं, तो देखें कि Android CheckBox के आसपास पैडिंग कैसे निकालें :
android:paddingLeft="-5dp"
android:layout_marginStart="-5dp"
android:layout_marginLeft="-5dp"
// or android:translationX="-5dp" instead of layout_marginLeft
<CheckBox
android:paddingRight="12dip" />
Bad idea for usability
नहीं यह नहीं। चेकबॉक्स और टेक्स्टव्यू दोनों को एक रेखीय लेआउट में रखें और उस रैखिक रेखा को अछूत बनाएं।
यदि आपके पास चेकबॉक्स या रेडियोबॉटन के लिए कस्टम छवि चयनकर्ता है तो आपको इस तरह के एक ही बटन और पृष्ठभूमि की संपत्ति निर्धारित करनी चाहिए:
<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" />
आप पृष्ठभूमि संपत्ति के साथ चेकबॉक्स या रेडियो बटन पैडिंग के आकार को नियंत्रित कर सकते हैं।
यदि आप कस्टम बटन बना रहे हैं, उदाहरण के लिए चेकबॉक्स ट्यूटोरियल का परिवर्तन देखो
फिर बस छवि के केंद्र में पारदर्शी पिक्सेल के एक या दो और कॉलम जोड़कर btn_check_label_background.9.png की चौड़ाई बढ़ाएँ; 9-पैच मार्करों को छोड़ दें जैसे वे हैं।
मुझे गैलेक्सी एस 3 मिनी (एंड्रॉइड 4.1.2) के साथ एक ही समस्या थी और मैंने बस अपने कस्टम चेकबॉक्स को चेकबॉक्स के बजाय AppCompatCheckBox विस्तारित किया । अब यह पूरी तरह से काम करता है।
इस आकार में अपनी गद्दी को जोड़ने के लिए आपको उस छवि का आकार प्राप्त करने की आवश्यकता है जिसका आप उपयोग कर रहे हैं। एंड्रॉइड इंटर्नल्स पर, वे आपके द्वारा बताए गए ड्रॉबल को प्राप्त करते हैं और बाद में उसके आकार का उपयोग करते हैं। चूंकि यह एक निजी चर है और ऐसे कोई गेटर्स नहीं हैं जिन तक आप पहुंच नहीं सकते हैं। इसके अलावा आप com.android.internal.R.styleable.CompoundButton को प्राप्त नहीं कर सकते हैं और वहां से प्राप्त कर सकते हैं।
तो आपको अपनी खुद की शैली बनाने की आवश्यकता है (यानी custom_src) या आप इसे सीधे अपने रेडियोधर्मिता के कार्यान्वयन में जोड़ सकते हैं:
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;
}
}
जैसा कि आप शायद अपनी android:button
संपत्ति के लिए एक चयन योग्य चयनकर्ता का उपयोग करते हैं, जिसे आपको इस तरह से जोड़ने android:constantSize="true"
और डिफ़ॉल्ट रूप से निर्दिष्ट करने की आवश्यकता होती है :
<?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 में विशेषता निर्दिष्ट करने की आवश्यकता है ।
विपक्ष:
लेआउट संपादक में आप पाठ को एपी 16 और नीचे वाले चेकबॉक्स के तहत ले जाएंगे, उस स्थिति में आप इसे सुझाए गए कस्टम चेकबॉक्स वर्ग जैसे कि एपीआई स्तर 16 के लिए बनाकर इसे ठीक कर सकते हैं ।
दलील:
यह एक बग है, क्योंकि StateListDrawable#getIntrinsicWidth()
कॉल का उपयोग आंतरिक रूप से किया जाता है, CompoundButton
लेकिन < 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"/>
और कुछ भी विशेष प्रोग्रामेटिक रूप से नहीं जोड़ा जाएगा।
चेकबॉक्स छवि ओवरलैपिंग थी जब मैंने चयनकर्ता से अपने स्वयं के ड्रॉबल्स का उपयोग किया था, तो मैंने नीचे दिए गए कोड का उपयोग करके इसे हल किया है:
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);
एलेक्स सेमेनिउक के लिए धन्यवाद
मैं छवियों को बदलकर इस मुद्दे को समाप्त करता हूं। बस पीएनजी फाइलों में अतिरिक्त पारदर्शी पृष्ठभूमि को जोड़ा। यह समाधान सभी एपीआई पर उत्कृष्ट काम करता है।
शायद यह देर हो चुकी है, लेकिन मैंने इस मुद्दे को प्रबंधित करने के लिए उपयोगिता विधियां बनाई हैं।
इस तरीके को अपने बर्तनों में जोड़ें:
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) एक्सएमएल में, एक के बाद एक करने के लिए आस-पास चेकबॉक्स और एक टेक्स्टव्यू जोड़ें; कुछ दूरी बनाए रखना। 2) 0sp पर चेकबॉक्स टेक्स्ट का आकार सेट करें। 3) चेकबॉक्स के आगे उस टेक्स्टव्यू के सापेक्ष पाठ जोड़ें।
<CheckBox android:drawablePadding="16dip"
- चित्र और पाठ के बीच पैडिंग।
TextView
साथdrawableLeft
और उपयोगdrawablePadding
करना होगा। कोड में केवल चयनित और अचयनित राज्यों को टॉगल करें।