У меня есть пользовательский вид, который представляет собой вертикальный индикатор выполнения. Это просто пользовательский вид, рисующий на холсте, чтобы заполнить снизу вверх процентом завершения. В моем xml у меня есть текст выше и текст под пользовательским элементом управления (есть два из них, один слева, один справа, вот справа):
<RelativeLayout android:layout_width="150dp"
android:layout_height="fill_parent" android:layout_alignParentRight="true">
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/bar_right_text" android:text="Right"
android:layout_alignParentTop="true" android:gravity="center_horizontal" />
<com.myApp.VBarView android:id="@+id/right_bar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/bar_right_text"/>
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/bar_right_time_text" android:text="Time Remaining" android:layout_below="@id/right_bar" android:gravity="center_horizontal" />
</RelativeLayout>
В моем собственном представлении я проверяю высоту всеми возможными способами, но всегда получаю высоту, которая полностью подходит к нижней части экрана
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// h here is 489
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
int myHt = getHeight();
int myMeasHt = getMeasuredHeight();
Rect canvasRct = canvas.getClipBounds();
// all of these (myHt, myMeasHt, and canvasRct.getHeight()) are all 489
}
До сих пор я пытался реверсировать представления в макете, поэтому верхний текст является первым (выровненным по верху), нижний текст - вторым (выровненным по нижнему краю), а пользовательский элемент управления является последним (layout_ над нижним текстом), как с match_parent, так и с wrap_content, но безрезультатно. Я попытался перейти на линейный макет, но без лучшего результата.
В случае, показанном в коде, отображается верхний текст, но нижний текст пропал. Когда я изменил порядок так, чтобы пользовательский вид был layout_ над нижним текстом, он просто переместил область рисования вверх, чтобы нижний текст был виден, но покрыл верхний текст. Обратите внимание, что когда я говорю, что нижний текст пропал, я имею в виду пропал, а не просто скрыт Мой последний тест состоял в том, чтобы жестко закодировать layout_height в «350dp» в макете.
Во всех случаях я всегда получаю высоту 489 на этом конкретном устройстве, даже с жестко заданной высотой. Я не могу понять, что мне нужно сделать, чтобы получить среднюю часть экрана, как что-то, на чем я могу рисовать, а остальное оставить в покое. Предполагается, что пользовательские представления являются последним элементом макета? Единственный способ заставить это работать - изменить порядок так, чтобы пользовательский вид был последним в макете, чтобы нижняя часть пользовательской области находилась поверх нижнего текста, нижний текст все еще отображался, а затем добавлялся вручную. около 150 до верха (т.е. не пишите в ноль на холсте, предоставленном onDraw ()), чтобы он не покрывал верхний текст. К счастью, рисунок, который я рисую, полупрозрачен, поэтому я могу видеть, покрыт ли текст или нет.
Кто-нибудь имеет больше информации о том, как это должно работать? Удалось ли мне объяснить, что я сделал более запутанным, чем реальная проблема?
Спасибо,
гб