Как я могу создать пользовательский вид с относительным размером? - PullRequest
0 голосов
/ 30 ноября 2010

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

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

Вот пользовательский класс 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?

Спасибо!

1 Ответ

2 голосов
/ 30 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...