Android TextView имеет высоту и ширину 0
У меня есть небольшой проект, в котором я хочу несколько раз использовать определенный компонент пользовательского интерфейса, поэтому я создал виджет, расширив ViewGroup. В этой группе ViewGroup я раздул представление, содержащее TextView внутри LinearLayout, и добавил, что раздутое представление в addGroup ViewGroup.
Внешний LinearLayout отлично расширяется, но внутренний TextView имеет getHeight() = 0 и getWith() = 0, когда я просматриваю его через Hierarchy Viewer. Странно, что layout_height и layout_width - это значения, которые я дал им в моем xml.
У меня здесь нет кода, но он выглядит примерно так:
xml:
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:text="random text.."
android:layout_with="200px"
android:layout_height="50px" />
</LinearLayout>
Java:
class MyWidget extends ViewGroup {
...
//In constructor
myView = View.inflate(context, R.layout.xml, null);
addView(myView);
//In layout
myView.layout(l, t, r, b);
Я попытался дать свой текстовый вид fill_parent значения для размера, но это не помогло.
Ответы
Ответ 1
Помните: getHeight()
и getWith()
return 0
, если компоненты еще не нарисованы.
Чтобы найти ширину и высоту a View
до ее рисования:
-
Первый вызов measure
view.measure(MeasureSpec.UNSPECIFIED,MeasureSpec.UNSPECIFIED)
-
Теперь вы можете получить ширину, используя getMeasuredWidth
и высоту, используя getMeasuredHeight
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
Я добавил несколько идей: Как получить ширину/высоту представления
Ответ 2
1) Вот несколько ссылок для использования Hierarchy Viewer на вашем телефоне.
http://developer.android.com/guide/developing/debugging/debugging-ui.html
и класс, который вам понадобится:
http://github.com/romainguy/ViewServer
2) Вы также можете повторно использовать компоновку как компонент с тегом include:
<include android:id="@+id/your_id" layout="@layout/layout_name" />
Ответ 3
Итак, я ставлю щедрость на этот, и вот что я нашел.
Раздувание с помощью ссылки null
- это плохая идея (TM). По сути, этот вид не будет иметь правильных параметров макета, которые ему нужны (его родительский набор задает целую кучу из них, включая целую кучу магии/логики). Таким образом, раздувание в null означает отсутствие родителей и отсутствие унаследованных параметров макета. Можно вручную установить ряд этих параметров, но из-за вовлеченной магии это может не решить вашу проблему.
"Решение (ы)", которое я придумал; используя (когда вы знаете, сколько вам нужно) и вытягиваете их в код, или раздуваете родителям (когда вам нужны истинные динамические вещи N). И, конечно, XML, который вы раздуваете, будет иметь конфликты с идентификаторами, поэтому я перехожу к нему, захватывая последнего ребенка (например, getChildAt (getChildCount() - 1)) того, что я ищу, и т.д.
Ответ 4
Вы пытались передать себя как корень:
View.inflate(context, R.layout.xml, this);
Поскольку вы будете родителем этого представления, который соответствует спецификации javadoc.