Where'd padding go, when setting background Drawable?

后端 未结 16 1304
攒了一身酷
攒了一身酷 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: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:

    
    
        
    
    

提交回复
热议问题