सवाल बटन के पाठ के साथ drawableLeft संरेखित


मेरा लेआउट यहाँ है:

enter image description here

जिस मुद्दे का सामना कर रहा हूं वह ड्रायबल चेकमार्क के साथ है। मैं टेक्स्ट के बगल में इसे संरेखित करने के बारे में कैसे जाउंगा, दोनों बटन के भीतर केंद्रित हैं? एक्सएमएल यहाँ है:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".PostAssignmentActivity" >

    <LinearLayout
        style="?android:attr/buttonBarStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal" >

        <Button
            style="?android:attr/buttonBarButtonStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:drawableLeft="@drawable/ic_checkmark_holo_light"
            android:text="Post" />

        <Button
            style="?android:attr/buttonBarButtonStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Cancel" />
    </LinearLayout>

</RelativeLayout>

एंड्रॉइड को लागू करना: गुरुत्वाकर्षण = "center_vertical" टेक्स्ट खींचता है और एक साथ खींचने योग्य होता है, लेकिन तब पाठ केंद्र में अब गठबंधन नहीं होता है।


44
2018-02-03 00:36


मूल




जवाब:


समाधान 1

सेट android:paddingLeft अपने पहले बटन के अंदर। यह मजबूर करेगा drawableLeft द्वारा paddingLeft दाईं ओर राशि। यह तेज़ / हैकी समाधान है।

समाधान 2

बटनव्यू का उपयोग करने के बजाय, एक लाइनरलाइट का उपयोग करें जिसमें टेक्स्टव्यू और छविदृश्य दोनों शामिल हैं। यह है एक बेहतर समाधान। यह आपको चेकमार्क की स्थिति में अधिक लचीलापन देता है।

निम्नलिखित कोड के साथ अपने बटन व्यू को बदलें। आपको चाहिए LinearLayout तथा TextView उपयोग करने के लिए buttonBarButtonStyle ताकि पृष्ठभूमि रंग चयन पर सही हो और टेक्स्ट आकार सही हो। आपको सेट करने की जरूरत है android:background="#0000" बच्चों के लिए, ताकि केवल लिनियरलाइट पृष्ठभूमि रंग को संभाल सके।

<LinearLayout
    style="?android:attr/buttonBarButtonStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="horizontal" >
    <ImageView 
        style="?android:attr/buttonBarButtonStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clickable="false"
        android:background="#0000"
        android:src="@drawable/ic_checkmark_holo_light"/>
    <TextView
        style="?android:attr/buttonBarButtonStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:clickable="false"
        android:background="#0000"
        android:text="Done" />
</LinearLayout>

यहां कुछ स्क्रीनशॉट दिए गए हैं जो मैंने कोशिश की थी।

enter image description here enter image description here enter image description here


60
2018-02-03 01:15



नेस्टेड लिनियरलाउउट्स के साथ गहरे दृश्य पदानुक्रम होने के कारण ListViews के प्रदर्शन कारणों के लिए एक बुरा विचार है। मुझे नहीं लगता कि यह यहां चिंता का विषय होना चाहिए। - Brian Attwell
इस विस्तृत लेखन के लिए धन्यवाद! :) - Randall Ma
प्रदर्शन और कोड पठनीयता के कारणों के लिए यह खराब समाधान है। पैडिंग का उपयोग करना एक बेहतर तरीका है जिसके साथ जाने के लिए और यदि यह पर्याप्त नहीं है, तो आप कैनवास और ऑनड्रा () विधि के साथ बटन दृश्य और ड्राइंग आइकन को विस्तारित करने पर विचार कर सकते हैं। - pawelo
Pawla, आप एक अच्छी बात दोहराते हैं। यदि आपके लेआउट में बहुत सारे बटन हैं (शायद एक सूची दृश्य के अंदर), मेरा समाधान # 1 आपके डिज़ाइन को संभाल नहीं लेता है और आप प्रदर्शन समस्याओं का सामना कर रहे हैं: आप अपने पदानुक्रम में दृश्यों की संख्या को कम करने के लिए बटन को ओवरराइड करना चाहेंगे। लेकिन आरटीएल लेआउट में इसका परीक्षण करने के लिए सावधान रहें। - Brian Attwell
क्या आप गुरुत्वाकर्षण को केंद्रीकृत करने के लिए सेट करना भूल गए थे LinearLayout? - corsair992


इन समाधानों में से कोई भी अस्वीकार्य व्यापार-बंद प्रस्तुत किए बिना सही तरीके से काम करता है (इसमें विचारों के साथ एक लेआउट बनाएं? अच्छा विचार नहीं है)। तो क्यों अपना खुद का रोल नहीं? मेरे पास बस यही है:

enter image description here

पहले एक बनाएँ attrs.xml इसके साथ:

<resources>
    <declare-styleable name="IconButton">
        <attr name="iconSrc" format="reference" />
        <attr name="iconSize" format="dimension" />
        <attr name="iconPadding" format="dimension" />
    </declare-styleable>
</resources>

यह विशिष्ट आकार, पाठ से पैडिंग, और हमारे नए दृश्य में छवि के साथ एक आइकन बनाने की अनुमति देता है। व्यू कोड इस तरह दिखता है:

public class IconButton extends Button {
    private Bitmap mIcon;
    private Paint mPaint;
    private Rect mSrcRect;
    private int mIconPadding;
    private int mIconSize;

    public IconButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs);
    }

    public IconButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public IconButton(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int shift = (mIconSize + mIconPadding) / 2;

        canvas.save();
        canvas.translate(shift, 0);

        super.onDraw(canvas);

        if (mIcon != null) {
            float textWidth = getPaint().measureText((String)getText());
            int left = (int)((getWidth() / 2f) - (textWidth / 2f) - mIconSize - mIconPadding);
            int top = getHeight()/2 - mIconSize/2;

            Rect destRect = new Rect(left, top, left + mIconSize, top + mIconSize);
            canvas.drawBitmap(mIcon, mSrcRect, destRect, mPaint);
        }

        canvas.restore();
    }

    private void init(Context context, AttributeSet attrs) {
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.IconButton);

        for (int i = 0; i < array.getIndexCount(); ++i) {
            int attr = array.getIndex(i);
            switch (attr) {
                case R.styleable.IconButton_iconSrc:
                    mIcon = drawableToBitmap(array.getDrawable(attr));
                    break;
                case R.styleable.IconButton_iconPadding:
                    mIconPadding = array.getDimensionPixelSize(attr, 0);
                    break;
                case R.styleable.IconButton_iconSize:
                    mIconSize = array.getDimensionPixelSize(attr, 0);
                    break;
                default:
                    break;
            }
        }

        array.recycle();

        //If we didn't supply an icon in the XML
        if(mIcon != null){
            mPaint = new Paint();
            mSrcRect = new Rect(0, 0, mIcon.getWidth(), mIcon.getHeight());
        }
    }

    public static Bitmap drawableToBitmap (Drawable drawable) {
        if (drawable instanceof BitmapDrawable) {
            return ((BitmapDrawable)drawable).getBitmap();
        }

        Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        drawable.draw(canvas);

        return bitmap;
    }
}

और फिर इसका उपयोग इस तरह किया जा सकता है:

<com.example.grennis.myapplication.IconButton
    android:layout_width="200dp"
    android:layout_height="64dp"
    android:text="Delete"
    app:iconSrc="@android:drawable/ic_delete"
    app:iconSize="32dp"
    app:iconPadding="6dp" />

यह मेरे लिए काम करता है।


31
2018-03-23 22:01



एंड्रॉइड 5 लॉलीपॉप पर माप टेक्स्ट () का उपयोग करके सावधानी बरतें, यह सभी टेक्स्ट सीएपीएस बटन टेक्स्ट खींच लेगा, लेकिन माप टेक्स्ट () स्ट्रिंग को वापस कर देगा क्योंकि यह एक्सएमएल में परिभाषित है। इसे ठीक करने के लिए सभी कैप्स स्पष्ट करें। - Greg Ennis
यह मेरे लिए सबसे अच्छा समाधान है क्योंकि मुझे डिफ़ॉल्ट प्रभाव सामग्री डिज़ाइन बटन को डिफ़ॉल्ट रूप से पुन: उत्पन्न करने की आवश्यकता नहीं थी - SIr Codealot
एक बग इमो को छोड़कर महान समाधान। छवि और पाठ केंद्रित नहीं हैं। केंद्र के लिए आपको canvas.restore () को स्थानांतरित करने की आवश्यकता है; super.onDraw (कैनवास) के ठीक पीछे; - Emanuel Moecklin


छवि और पाठ के साथ सामग्री के मुकाबले कहीं अधिक व्यापक है जो बटन रखने के नतीजे हासिल करने के लिए, कुछ भी फैंसी किए बिना, एक साफ आसान तरीका है।

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:background="@drawable/button_background_selector">

    <Button
        android:layout_centerInParent="true"
        android:gravity="center"
        android:duplicateParentState="true"
        android:layout_width="wrap_content"
        android:text="New User"
        android:textSize="15sp"
        android:id="@android:id/button1"
        android:textColor="@android:color/white"
        android:drawablePadding="6dp"
        android:drawableLeft="@drawable/add_round_border_32x32"
        android:layout_height="64dp" />

</RelativeLayout>

enter image description here


14
2018-04-02 19:35



इस प्रकार के बटन बनाने के लिए यह सबसे आसान समाधान है। - Ionut Negru
RelativeLayout का उपयोग करने का भयानक तरीका, ऐसा मत करो। - Pedro Paulo Amorim
एक रिलेटिवलायआउट के भीतर एक मानक चेकबॉक्स को घोंसला करना मेरे लिए बहुत अच्छा काम करता है। बटन छवि को पक्षपातपूर्ण छोड़ दिया गया था, पाठ माता-पिता / स्क्रीन आकार के आकार के आधार पर एक परिवर्तनीय दूरी दूर था ... रिलेटिवलायआउट के भीतर घोंसले ने चेकबॉक्स के आकार को सामान्यीकृत किया (जहां बटन और टेक्स्ट ठीक दिखते थे) और दोनों को अनुमति दी गई केंद्रित होना - WM1
इसका नकारात्मक हिस्सा बटन की तरह दिखता है जो टापेबल नहीं है। और यदि आपके बटन में प्रेस / आदि पर राज्य परिवर्तन हैं तो यह अजीब लगेगा। - JohnnyLambada
मेरे लिए, यह अब तक का सबसे उपयोगी टुकड़ा था: "एंड्रॉइड: drawablePadding =" 6dp "धन्यवाद। - Roga Men


यहां मेरा कोड है और सही काम कर रहा है।

<Button
    android:id="@+id/button"
    android:layout_width="200dp"
    android:layout_height="50dp"
    android:layout_gravity="center"
    android:background="@drawable/green_btn_selector"
    android:gravity="left|center_vertical"
    android:paddingLeft="50dp"
    android:drawableLeft="@drawable/plus"
    android:drawablePadding="5dp"
    android:text="@string/create_iou"
    android:textColor="@color/white" />

7
2018-05-08 06:41



यह केवल तभी काम करेगा जब बटन एक सेट आकार हो। - Clive Jefferies
पहुंच के कारणों के लिए बटन भी बेहतर हैं। एक्सेसिबिलिटी फीचर्स का उपयोग करने वाले उपयोगकर्ता यह नहीं जानते कि उन्हें एक ImageView और TextView के साथ एक LinearLayout दबाया जाना चाहिए। - adamame
के लिए +1 android:drawablePadding पूरी तरह से काम करता है @CliveJefferies यह आकार के लिए काम करता है wrap content - vedant


हमारे मामले में, हम डिफ़ॉल्ट बटन वर्ग (अपनी विभिन्न शैलियों और व्यवहारों को प्राप्त करने के लिए) का उपयोग करना चाहते थे और हमें कोड में बटन बनाने में सक्षम होना आवश्यक था। इसके अलावा, हमारे मामले में हम टेक्स्ट, एक आइकन (बाईं ओर खींचने योग्य), या दोनों हो सकते हैं।

लक्ष्य बटन और चौड़ाई को समूह के रूप में केन्द्रित करना था जब बटन चौड़ाई wrap_content से व्यापक थी।

public class CenteredButton extends Button
{
    public CenteredButton(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);

        // We always want our icon and/or text grouped and centered.  We have to left align the text to
        // the (possible) left drawable in order to then be able to center them in our onDraw() below.
        //
        setGravity(Gravity.LEFT|Gravity.CENTER_VERTICAL);
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        // We want the icon and/or text grouped together and centered as a group.

        // We need to accommodate any existing padding
        //
        float buttonContentWidth = getWidth() - getPaddingLeft() - getPaddingRight();

        // In later versions of Android, an "all caps" transform is applied to buttons.  We need to get
        // the transformed text in order to measure it.
        //
        TransformationMethod method = getTransformationMethod();
        String buttonText = ((method != null) ? method.getTransformation(getText(), this) : getText()).toString();
        float textWidth = getPaint().measureText(buttonText);

        // Compute left drawable width, if any
        //
        Drawable[] drawables = getCompoundDrawables();
        Drawable drawableLeft = drawables[0];
        int drawableWidth = (drawableLeft != null) ? drawableLeft.getIntrinsicWidth() : 0;

        // We only count the drawable padding if there is both an icon and text
        //
        int drawablePadding = ((textWidth > 0) && (drawableLeft != null)) ? getCompoundDrawablePadding() : 0;

        // Adjust contents to center
        //
        float bodyWidth = textWidth + drawableWidth + drawablePadding;
        canvas.translate((buttonContentWidth - bodyWidth) / 2, 0);

        super.onDraw(canvas);
    }
}

6
2018-05-29 21:22



मुझे यह समाधान पसंद है क्योंकि यह मेरे ड्रॉइंग टिंट को सही ढंग से प्रस्तुत करता है। हालांकि, मैं चाहता था कि आइकन आइकन के साथ बाईं ओर केंद्रित हो, जबकि यह कोड आइकन + टेक्स्ट को केंद्रित करता है। मैंने ग्रेग के आइकन बटन के उदाहरणों के साथ अनुवाद को प्रतिस्थापित किया है, इसलिए यह काम करेगा: int left = (int) ((getWidth () / 2f) - (textWidth / 2f) - drawableWidth - drawablePadding); कैनवास। ट्रांसस्लेट (बाएं, 0); - Dandalf
कोड के लिए धन्यवाद। कंपैट लाइब्रेरी का उपयोग कर टिंट रखने के लिए, मैंने विस्तार किया है AppCompatButton नियमित बटन के बजाय - Alin


public class DrawableCenterTextView extends TextView {

    public DrawableCenterTextView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
    }

    public DrawableCenterTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public DrawableCenterTextView(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Drawable[] drawables = getCompoundDrawables();
        if (drawables != null) {
            Drawable drawableLeft = drawables[0];
            Drawable drawableRight = drawables[2];
            if (drawableLeft != null || drawableRight != null) {
                float textWidth = getPaint().measureText(getText().toString());
                int drawablePadding = getCompoundDrawablePadding();
                int drawableWidth = 0;
                if (drawableLeft != null)
                    drawableWidth = drawableLeft.getIntrinsicWidth();
                else if (drawableRight != null) {
                    drawableWidth = drawableRight.getIntrinsicWidth();
                }
                float bodyWidth = textWidth + drawableWidth + drawablePadding;
                canvas.translate((getWidth() - bodyWidth) / 2, 0);
            }
        }
        super.onDraw(canvas);
    }
}

3
2017-12-09 13:08





मैंने साथ शुरू किया @ बॉबडिंक्सन का जवाब, लेकिन यह कई लाइनों के साथ अच्छी तरह से सामना नहीं किया था। दृष्टिकोण अच्छा है, क्योंकि आप अभी भी एक के साथ खत्म हो गया है Button ठीक से पुन: उपयोग किया जा सकता है।

यहां एक अनुकूलित समाधान है जो बटन पर कई लाइनों के साथ काम करेगा (कृपया पूछें क्यों नहीं।)

बस विस्तार करें Button और निम्नलिखित में उपयोग करें onDraw, द getLineRight() प्रत्येक पंक्ति की वास्तविक लंबाई को देखने के लिए प्रयोग किया जाता है।

@Override
protected void onDraw(Canvas canvas) {
    // We want the icon and/or text grouped together and centered as a group.
    // We need to accommodate any existing padding
    final float buttonContentWidth = getWidth() - getPaddingLeft() - getPaddingRight();

    float textWidth = 0f;
    final Layout layout = getLayout();
    if (layout != null) {
        for (int i = 0; i < layout.getLineCount(); i++) {
            textWidth = Math.max(textWidth, layout.getLineRight(i));
        }
    }

    // Compute left drawable width, if any
    Drawable[] drawables = getCompoundDrawables();
    Drawable drawableLeft = drawables[0];
    int drawableWidth = (drawableLeft != null) ? drawableLeft.getIntrinsicWidth() : 0;

    // We only count the drawable padding if there is both an icon and text
    int drawablePadding = ((textWidth > 0) && (drawableLeft != null)) ? getCompoundDrawablePadding() : 0;

    // Adjust contents to center
    float bodyWidth = textWidth + drawableWidth + drawablePadding;

    canvas.save();
    canvas.translate((buttonContentWidth - bodyWidth) / 2, 0);
    super.onDraw(canvas);
    canvas.restore();
}

1
2017-09-19 08:18





यहां एक और समाधान है:

     <LinearLayout
        android:id="@+id/llButton"
        android:layout_width="match_parent"
        style="@style/button_celeste"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            style="@style/button_celeste"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:drawablePadding="10dp"
            android:clickable="false"
            android:drawableLeft="@drawable/icon_phone"
            android:text="@string/call_runid"/>
    </LinearLayout>

और घटना:

    LinearLayout btnCall = (LinearLayout) findViewById(R.id.llButton);
    btnCall.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            call(runid.Phone);
        }
    });

0
2017-08-26 06:09





मेरे पास एक ही समस्या थी, और मैं ऐसे समाधान के साथ आया हूं जिसके लिए एक्सएमएल परिवर्तन या कस्टम दृश्यों की आवश्यकता नहीं है।

यह कोड स्निपेट टेक्स्ट की चौड़ाई और बाएं / दाएं ड्रॉबल्स को पुनर्प्राप्त करता है, और बटन के बाएं / दाएं पैडिंग को सेट करता है, इसलिए टेक्स्ट और ड्रॉबल्स को खींचने के लिए केवल पर्याप्त जगह होगी, और कोई और पैडिंग नहीं जोड़ा जाएगा। इसे बटन के साथ-साथ टेक्स्ट व्यू, उनके सुपरक्लास पर भी लागू किया जा सकता है।

public class TextViewUtils {
    private static final int[] LEFT_RIGHT_DRAWABLES = new int[]{0, 2};

    public static void setPaddingForCompoundDrawableNextToText(final TextView textView) {
        ViewTreeObserver vto = textView.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                shinkRoomForHorizontalSpace(textView);
            }
        });

    }

    private static void shinkRoomForHorizontalSpace(TextView textView) {
        int textWidth = getTextWidth(textView);
        int sideCompoundDrawablesWidth = getSideCompoundDrawablesWidth(textView);
        int contentWidth = textWidth + sideCompoundDrawablesWidth;
        int innerWidth = getInnerWidth(textView);
        int totalPadding = innerWidth - contentWidth;
        textView.setPadding(totalPadding / 2, 0, totalPadding / 2, 0);
    }

    private static int getTextWidth(TextView textView) {
        String text = textView.getText().toString();
        Paint textPaint = textView.getPaint();
        Rect bounds = new Rect();
        textPaint.getTextBounds(text, 0, text.length(), bounds);
        return bounds.width();
    }

    private static int getSideCompoundDrawablesWidth(TextView textView) {
        int sideCompoundDrawablesWidth = 0;
        Drawable[] drawables = textView.getCompoundDrawables();
        for (int drawableIndex : LEFT_RIGHT_DRAWABLES) {
            Drawable drawable = drawables[drawableIndex];
            if (drawable == null)
                continue;
            int width = drawable.getBounds().width();
            sideCompoundDrawablesWidth += width;
        }
        return sideCompoundDrawablesWidth;
    }

    private static int getInnerWidth(TextView textView) {
        Rect backgroundPadding = new Rect();
        textView.getBackground().getPadding(backgroundPadding);
        return textView.getWidth() - backgroundPadding.left - backgroundPadding.right;
    }
}

नोटिस जो:

  • यह वास्तव में अभी भी आवश्यकतानुसार कुछ और जगह छोड़ देता है (मेरे उद्देश्यों के लिए पर्याप्त है, लेकिन आप त्रुटि की तलाश कर सकते हैं)
  • यह जो भी बाएं / दाएं पैडिंग है वहां ओवरराइट करता है। मुझे लगता है कि इसे ठीक करना मुश्किल नहीं है।

इसका उपयोग करने के लिए, बस कॉल करें TextViewUtils.setPaddingForCompoundDrawableNextToText(button) तुम्हारे ऊपर onCreate या onViewCreated()


0
2017-10-03 13:25



इस तरह कुछ ऐसा करने की कोशिश नहीं की है, लेकिन 2.x, 4.x, 5.x और 6.x एपीआई के समय में प्रत्येक ने पाठ के पिक्सेल आकारों का अलग-अलग मूल्यांकन किया है, मैंने कभी भी सार्वभौमिक काम नहीं किया एंड्रॉइड के सभी वांछित संस्करणों में कोड, खासकर 5.x बनाम 6.x पूरी तरह अलग आईआईआरसी था, जिसमें उन कार्यों के कार्यान्वयन में कुछ आंतरिक बग शामिल थे ... यदि आपने आज सामान्य एपीआई में कुछ व्यापक परीक्षण किया है, तो यह निर्दिष्ट करना सहायक होगा कि आपके उत्तर में, आप जानते हैं कि यह अच्छी तरह से काम करता है। - Ped7g


इस समस्या के कई समाधान हैं। शायद कुछ उपकरणों पर सबसे आसान उपयोग करना है paddingRight तथा paddingLeft एक दूसरे के बगल में छवि और पाठ को नीचे के रूप में स्थानांतरित करने के लिए।

मूल बटन

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginStart="32dp"
    android:layout_marginEnd="32dp"
    android:layout_marginTop="16dp"
    android:text="@string/scan_qr_code"
    android:textColor="@color/colorPrimary"
    android:drawableLeft="@drawable/ic_camera"
    android:paddingRight="90dp"
    android:paddingLeft="90dp"
    android:gravity="center"
    />

Using Padding can work

यहां समस्या छोटी डिवाइसों पर है, यह पैडिंग दुर्भाग्यपूर्ण समस्याओं का कारण बन सकती है जैसे कि: enter image description here

अन्य समाधान "लेआउट के बाहर एक बटन बनाएं और एक टेक्स्टव्यू" के कुछ संस्करण हैं। वे काम करते हैं, लेकिन एक बटन को पूरी तरह से अनुकरण करना मुश्किल हो सकता है। मैं एक और समाधान का प्रस्ताव करता हूं; "किसी लेआउट से एक बटन बनाएं, एक टेक्स्टव्यू, और एक बटन"

जैसा कि मैंने प्रस्तावित किया है वही बटन दिया गया है:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginStart="32dp"
    android:layout_marginEnd="32dp"
    android:layout_marginTop="16dp"
    android:gravity="center"
    >
    <Button
        android:id="@+id/scanQR"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/white_bg_button"
        />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:elevation="10dp"
        >
        <ImageView
            android:id="@+id/scanImage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="8dp"
            android:src="@drawable/ic_camera"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Button"
            android:text="@string/scan_qr_code"
            android:textColor="@color/colorPrimary"
            />
    </LinearLayout>
</RelativeLayout>

जैसा कि आप देख सकते हैं, बटन अब एक रिश्तेदार लेआउट के भीतर है, लेकिन यह टेक्स्ट और ड्रॉइंग लेट बटन का हिस्सा नहीं है, वे बटन के शीर्ष पर स्थित एक अलग लेआउट में हैं। इसके साथ, बटन अभी भी एक बटन की तरह काम करता है। गॉथचास हैं:

  1. आंतरिक लेआउट को एंड्रॉइड के नए संस्करणों के लिए एक ऊंचाई की आवश्यकता है। बटन में छविव्यू और टेक्स्ट व्यू से अधिक ऊंचाई है, भले ही उन्हें परिभाषित किया गया हो बाद बटन, वे अभी भी ऊंचाई में "नीचे" होंगे और अदृश्य हो जाएंगे। 'एंड्रॉइड: एलिवेशन' से 10 तक सेट करना इसे हल करता है।
  2. टेक्स्ट व्यू का टेक्स्ट एपियरेंस सेट होना चाहिए ताकि यह एक बटन में जैसा दिखता हो।

0
2017-09-18 23:34





एक और काफी हैकी विकल्प खाली स्पेसर दृश्यों को जोड़ना है weight="1" बटन के प्रत्येक तरफ। मुझे नहीं पता कि यह प्रदर्शन को कैसे प्रभावित करेगा।

    <View
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="1" />

-4
2017-11-21 11:10



मुझे नहीं लगता कि यह संभव है, आप बटन के अंदर तत्व जोड़ नहीं सकते हैं - Mehdiway
आप बटन के भीतर नहीं बटन के दोनों तरफ स्पेसर दृश्य डाल देंगे। यह बटन के पाठ और खींचने योग्य केंद्रों को केंद्रित करता है। स्पेसर क्षेत्र बटन के एक क्लिक करने योग्य भाग नहीं हैं। इस तकनीक का उपयोग लेआउट क्लिक करने योग्य बनाने के लिए भी किया जा सकता है। यह एक अच्छा समाधान नहीं है लेकिन यह कुछ लोगों के लिए उपयुक्त हो सकता है। - TTransmit