Как я могу создать собственное представление с относительным размером?

Я хотел бы разработать приложение, которое могло бы работать с устройствами с любым разрешением экрана.

Моя идея заключалась в том, чтобы создать одно пользовательское представление для каждого типа представления, которое я использую, и использовать layout_width и layout_height, указанные в XML, в процентах от родительского размера (например, layout_width="100dp" эквивалентно fill_parent, а layout_width="50dp" означает, что View будет иметь половину ширины родителя).

Вот пользовательский класс TextView, который я сделал:

public class RSTextView extends TextView {

    public RSTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int w, int h) {
        int parentWidth = ((View)this.getParent()).getWidth();
        int parentHeight = ((View)this.getParent()).getHeight();
        Log.i(null, "Width: " + w + "; Height: " + parentHeight);
        this.setMeasuredDimension(parentWidth * MeasureSpec.getSize(w) / 100,
                parentHeight * MeasureSpec.getSize(h) / 100);
    }
}

Однако это не работает. Размер parentWidth и parentHeight всегда равен 0.

Есть ли лучший способ создать приложение с относительным размером?

И если это правильный путь, как я могу получить размер родителей View из метода onMeasure?


person nbarraille    schedule 30.11.2010    source источник


Ответы (1)


Поскольку вы проверяете высоту представления на этапе макета, вы, вероятно, захотите использовать getMeasuredHeight, а не getHeight, но я не уверен, что вам вообще нужно делать то, что вы делаете. По вашему описанию сложно сказать, но похоже, что вы пытаетесь воссоздать поведение LinearLayout веса. Например, если у вас есть горизонтальный LinearLayout с 3 дочерними элементами, вы можете легко настроить первый так, чтобы он занимал половину его ширины, а остальные — по 25%, назначив им 0px layout_widths и layout_weights из 2, 1 и 1 соответственно (или любые другие веса этих пропорций).

Однако, если вы решите пойти по пользовательскому маршруту View, не перегружайте то, что делают layout_height и layout_width — используйте пользовательские атрибуты XML, чтобы принять аргумент для процентов (я бы покопался в коде LinearLayout, чтобы увидеть, как реализован layout_weight) .

person Yoni Samlan    schedule 30.11.2010
comment
Спасибо! Ну проблема в том, что layout_weight работает только с LinearLayout, а не с RelativeLayout. Но я запутался, как лучше всего писать приложения, работающие с устройствами любого размера? - person nbarraille; 01.12.2010