Как измерить представление Android на основе размеров его родителя

Как я могу измерить представление на основе размера его родительского расположения. Например, у меня есть a RelativeLayout это заполняет полный экран, и я хочу дочернее представление, говорю ImageView, поднять общую высоту и 1/2 ширина?

Я попытался переопределить все на onMeasure, onLayout, onSizeChanged, и т.д. и я не мог заставить это работать....

100
задан Mike Baxter 21 September 2015 в 11:19
поделиться

3 ответа

Когда вы определяете компоновку и вид в XML, вы можете указать ширину и высоту компоновки вида как содержимое обертки, так и заполнить родительскую часть. Занять половину области немного сложнее, но если у вас есть что-то, что вы хотите на другой половине, вы можете сделать что-то вроде следующего.

   <LinearLayout android:layout_width="fill_parent"
                android:layout_height="fill_parent">
        <ImageView android:layout_height="fill_parent"
                 android:layout_width="0dp"
                 android:layout_weight="1"/>
        <ImageView android:layout_height="fill_parent"
                 android:layout_width="0dp"
                 android:layout_weight="1"/>
   </LinearLayout>

Придание двум вещам одинакового веса означает, что они будут растягиваться, чтобы занять ту же самую часть экрана. Более подробную информацию о макетах смотрите в в документах Dev.

16
ответ дан 24 November 2019 в 04:50
поделиться

Роман, если вы хотите сделать компоновку в коде Java (потомок ViewGroup), то это возможно. Хитрость в том, что вам нужно реализовать оба метода onMeasure и onLayout. Сначала вызывается onMeasure, и вам нужно "измерить" вложенное представление (эффективно изменяя его размер до нужного значения) там. В вызове onLayout нужно снова изменить размер. Если вы не выполните эту последовательность или не вызовете setMeasuredDimension() в конце кода onMeasure, вы не получите результата. Почему это спроектировано таким сложным и хрупким способом - уму непостижимо.

1
ответ дан 24 November 2019 в 04:50
поделиться

Вы можете решить эту проблему, создав пользовательский View и переопределив метод onMeasure (). Если вы всегда используете «fill_parent» для layout_width в вашем xml, тогда параметр widthMeasureSpec, который передается в метод onMeasusre (), должен содержать ширину родительского элемента.

public class MyCustomView extends TextView {

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
        int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
        this.setMeasuredDimension(parentWidth / 2, parentHeight);
    }
}   

Ваш XML будет выглядеть примерно так:

<LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <view
        class="com.company.MyCustomView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
39
ответ дан 24 November 2019 в 04:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: