Как я могу измерить представление на основе размера его родительского расположения. Например, у меня есть a RelativeLayout
это заполняет полный экран, и я хочу дочернее представление, говорю ImageView
, поднять общую высоту и 1/2 ширина?
Я попытался переопределить все на onMeasure
, onLayout
, onSizeChanged
, и т.д. и я не мог заставить это работать....
Когда вы определяете компоновку и вид в 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.
Роман, если вы хотите сделать компоновку в коде Java (потомок ViewGroup), то это возможно. Хитрость в том, что вам нужно реализовать оба метода onMeasure и onLayout. Сначала вызывается onMeasure, и вам нужно "измерить" вложенное представление (эффективно изменяя его размер до нужного значения) там. В вызове onLayout нужно снова изменить размер. Если вы не выполните эту последовательность или не вызовете setMeasuredDimension() в конце кода onMeasure, вы не получите результата. Почему это спроектировано таким сложным и хрупким способом - уму непостижимо.
Вы можете решить эту проблему, создав пользовательский 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>