Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Where to set size of view which is field of class extending RelativeLayout?

I have a class MyLayout extending RelativeLayout which includes View type field. MyLayout object is created in xml layout file, so all properties are set there. I need to programatically set size of View field which depends on size of it's parent (MyLayout).

I was trying to set it in constructor, but when I try to use getWidth() method, it returns 0, so I assume that the size is not yet set inside a constructor. I was also trying to set it in onDraw() method, but when I run an application, this internal View is displayed for like second with it's default size and after that time it's scaled to the right size. Then I tried putting it inside onMeasure() method, but this one is called a few times, so again it doesn't seem to be efficient at all.

So what could be the best place to set it?

This is my class:

public class MyLayout extends RelativeLayout {

    private View pointer;

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

        init(context);
    }

    public MyLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

        init(context);
    }

    public MyLayout(Context context) {
        super(context);

        init(context);
    }

    private void init(Context c) {
        pointer = new View(c);
        pointer.setBackgroundResource(R.drawable.pointer);
        addView(pointer);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)pointer.getLayoutParams();
        lp.height = (int)(getHeight() * 0.198);
        lp.width = (int)(getWidth() * 0.198);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}
like image 221
Piotr Chojnacki Avatar asked Nov 28 '25 02:11

Piotr Chojnacki


1 Answers

in your MyLayout class, override onSizeChanged():

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

     RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)pointer.getLayoutParams();
     lp.height = (int)(getHeight() * 0.198);
     lp.width = (int)(getWidth() * 0.198);

};
like image 127
Manish Avatar answered Nov 30 '25 17:11

Manish



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!