Search code examples
androidxmlandroid-linearlayoutscaleandroid-image

Is setPadding broken for LinearLayout?


I have a very short problem. I have a custom control that is based upon LinearLayout. I inflate it's view from xml', in which the root is set as element.

Now when I try to set the padding of this custom control by "this.setPadding(x,x,x,x)" it does not affect the TextView and ImageView I add to this control in a few lines of code later.

Currently I am bypysing it, by setting the margin of each control separately, to achieve the global padding of the whole custom control, but it would be nice to know if there is a catch in using setPadding dynamicaly, or maybe a mistake is mine.

To simplify, my case looks like that:

setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL);
LinearLayout.LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); setLayoutParams(lp);

setPadding(0, 30, 0, 30); //I know it's in px

Afterwards I'm adding a large image, which shrinks due to it's size, but the padding of LinearLayout(which I try to set dynamicaly) does not affect it, only if I set margin on it directly.

Any tip would be greatly appriciated.


Solution

  • After a little of digging, found an answer through other StackOverflow question: https://stackoverflow.com/a/13363318/905938

    Basicaly if one person sets a background reasource with a selector xml given (as in my case) it overrides completely the previous padding setting. So the padding I was setting within the custom control initialization was lost as soon as it was set.

    Now that I know the problem, I basicaly just intercept the call to this method in my custom control like this:

    @Override
    public void setBackgroundResource(int resid)
    {
        int paddingLeft, paddingTop, paddingRight, paddingBottom;
        paddingLeft = getPaddingLeft();
        paddingTop = getPaddingTop();
        paddingRight = getPaddingRight();
        paddingBottom = getPaddingBottom();
    
        super.setBackgroundResource(resid);
    
        setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
    }
    

    That solves the problem, and I hope will solve a problem for anybody who will find this question with a similar problem.