Where'd padding go, when setting background Drawable?

后端 未结 16 1263
攒了一身酷
攒了一身酷 2020-12-03 00:41

I have this issue on my EditText and Button views, where I have a nice padding for them to space away from the text, but when I change the backgrou

相关标签:
16条回答
  • 2020-12-03 00:42

    Most of answers are correct but should handle the background setting correctly.

    First get the padding of your view

    //Here my view has the same padding in all directions so I need to get just 1 padding
    int padding = myView.getPaddingTop();
    

    Then set the background

    //If your are supporting lower OS versions make sure to verify the version
    if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
        //getDrawable was deprecated so use ContextCompat                            
        myView.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.bg_accent_underlined_white));
    } else {
        myView.setBackground(ContextCompat.getDrawable(context, R.drawable.bg_accent_underlined_white));
    }
    

    Then set the padding the view had before the background change

    myView.setPadding(padding, padding, padding, padding);
    
    0 讨论(0)
  • 2020-12-03 00:48

    I found another solution. I was facing the similar problem with Buttons. Eventually, i added:

    android:scaleX= "0.85"
    android:scaleY= "0.85"
    

    it worked for me. The default padding is almost the same.

    0 讨论(0)
  • 2020-12-03 00:49

    I was able to wrap the element inside another layout, in this case, a FrameLayout. That enabled me to change the background on the FrameLayout without destroying the padding, which is on the contained RelativeLayout.

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/commentCell"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:background="@drawable/comment_cell_bg_single" >
    
        <RelativeLayout android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:padding="20dp" >
    
        <ImageView android:id="@+id/sourcePic"
                   android:layout_height="75dp"
                   android:layout_width="75dp"
                   android:padding="5dp"
                   android:background="@drawable/photoframe" 
         />
    ...
    

    The other option is to set it programmatically after setting the background Drawable as suggested above. Just make sure to calculate the pixels to correct for the resolution of the device.

    0 讨论(0)
  • 2020-12-03 00:51

    Here an improved version of cottonBallPaws' setBackgroundAndKeepPadding. This maintains the padding even if you call the method multiple times:

    /**
     * Sets the background for a view while preserving its current padding. If the background drawable
     * has its own padding, that padding will be added to the current padding.
     */
    public static void setBackgroundAndKeepPadding(View view, Drawable backgroundDrawable) {
    
        Rect drawablePadding = new Rect();
        backgroundDrawable.getPadding(drawablePadding);
    
        // Add background padding to view padding and subtract any previous background padding
        Rect prevBackgroundPadding = (Rect) view.getTag(R.id.prev_background_padding);
        int left = view.getPaddingLeft() + drawablePadding.left -
                (prevBackgroundPadding == null ? 0 : prevBackgroundPadding.left);
        int top = view.getPaddingTop() + drawablePadding.top -
                (prevBackgroundPadding == null ? 0 : prevBackgroundPadding.top);
        int right = view.getPaddingRight() + drawablePadding.right -
                (prevBackgroundPadding == null ? 0 : prevBackgroundPadding.right);
        int bottom = view.getPaddingBottom() + drawablePadding.bottom -
                (prevBackgroundPadding == null ? 0 : prevBackgroundPadding.bottom);
        view.setTag(R.id.prev_background_padding, drawablePadding);
    
        view.setBackgroundDrawable(backgroundDrawable);
        view.setPadding(left, top, right, bottom);
    }
    

    You need to define a resource id via values/ids.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <item name="prev_background_padding" type="id"/>
    </resources>
    
    0 讨论(0)
  • 2020-12-03 00:52

    You can give some padding by using 9-patch images and defining the content area in the drawable. Check this

    You can also set the padding in your layout from xml or programatically

    xml padding tags

    android:padding
    android:paddingLeft
    android:paddingRight
    android:paddingTop
    android:paddingBottom
    

    You can try setting the padding manually from the code after you call the setBackgroundDrawable by calling setPadding on your EditText or Button Views

    0 讨论(0)
  • 2020-12-03 00:53

    Backward compatable version of cottonBallPaws's answer

    /** 
      * Sets the background for a view while preserving its current     padding. If the background drawable 
      * has its own padding, that padding will be added to the current padding. 
     *  
     * @param view View to receive the new background. 
     * @param backgroundDrawable Drawable to set as new background. 
     */ 
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    @SuppressWarnings("deprecation")
    public static void setBackgroundAndKeepPadding(View view, Drawable backgroundDrawable) {
        Rect drawablePadding = new Rect();
        backgroundDrawable.getPadding(drawablePadding);
        int top = view.getPaddingTop() + drawablePadding.top;
        int left = view.getPaddingLeft() + drawablePadding.left;
        int right = view.getPaddingRight() + drawablePadding.right;
        int bottom = view.getPaddingBottom() + drawablePadding.bottom;
    
        int sdk = android.os.Build.VERSION.SDK_INT;
        if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
            view.setBackgroundDrawable(backgroundDrawable);
        } else {
            view.setBackground(backgroundDrawable);
        }
        view.setPadding(left, top, right, bottom);
    }
    
    0 讨论(0)
提交回复
热议问题