Lucas
Lucas

Reputation: 3591

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.

Upvotes: 1

Views: 1228

Answers (1)

Lucas
Lucas

Reputation: 3591

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.

Upvotes: 7

Related Questions