Подтвердить что ты не робот

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 значения для размера, но это не помогло.

4b9b3361

Ответ 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.