准确的方法来确定视图的测量高度,甚至在它从GONE变为VISIBLE之前

时间:2013-10-08 18:26:34

标签: android

目前,我的布局看起来像这样。它包含。

  • 标题文本视图和价格文本视图,始终可见。
  • 描述文字视图,可以显示或消失,具体取决于展开或折叠。

折叠(在应用启动期间)

enter image description here

扩展(当用户点击它时)

enter image description here

我希望周围有一些不错的动画。所以,我提到https://stackoverflow.com/a/13381228/72437

其中一个关键因素是知道描述文本视图的确切高度,甚至在它可见之前。

然而,我意识到了一些类型的代码。它们不准确

// v is description text view.
v.measure(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
final int targtetHeight = v.getMeasuredHeight();

// v is description text view.
v.measure(MeasureSpec.makeMeasureSpec(LayoutParams.MATCH_PARENT, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.EXACTLY));
final int targtetHeight = v.getMeasuredHeight();

这将返回值32.(正确的测量高度假设为92)。这是第一行文本的高度。最终我的动画结束于

enter image description here

我可以知道,确定视图的测量高度的正确方法是什么,甚至在它从GONE变为VISIBLE之前?

我的布局代码如下:

        <LinearLayout
            android:clickable="true"
            android:id="@+id/chart_linear_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="@drawable/dummy"
            android:orientation="vertical">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                android:orientation="horizontal">
                <TextView
                    android:layout_width="0dp"
                    android:width="0dp"
                    android:layout_weight="0.6"
                    android:layout_height="match_parent"
                    android:gravity="left"
                    android:textSize="20sp" 
                    android:textColor="#ff000000"
                    android:text="Summary chart" />
                <TextView
                    android:id="@+id/chart_price_text_view"
                    android:layout_width="0dp"
                    android:width="0dp"
                    android:layout_weight="0.4"
                    android:layout_height="match_parent"
                    android:gravity="right"
                    android:textSize="20sp" 
                    android:textColor="#ffF76D3C"
                    android:text="$2.99" />

            </LinearLayout>
            <TextView
                android:visibility="gone"
                android:id="@+id/chart_description_text_view"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_marginBottom="10dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"         
                android:text="@string/currency_exchange_description"
                android:textColor="#ff626262"
                android:textSize="15sp" />                 
        </LinearLayout>

2 个答案:

答案 0 :(得分:33)

您的第二个代码段几乎是正确的,但您需要指定像素大小 - 而不是FILL_PARENT/MATCH_PARENT。这应该有效:

v.measure(MeasureSpec.makeMeasureSpec(parentView.getWidth(), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(MAX_HEIGHT, MeasureSpec.AT_MOST));
final int targetHeight = v.getMeasuredHeight();

您需要引用v是获取其宽度的子类的ViewGroup,并定义MAX_HEIGHT(或者可能使用父视图的高度?)。

此外,您应该将水平LinearLayout内的两个TextView的高度参数更改为wrap_content,因为这里使用match_parent可能会导致问题。 LinearLayout设置为wrap_content,但这两个子节点没有指定高度。

答案 1 :(得分:2)

我为手风琴组件完成了这个。我面临同样的问题,扩展我的手风琴,需要“目的地”的高度,即扩张后的高度。 这将返回正确的高度:

/***
 * This function returns the actual height the layout. The getHeight() function returns the current height which might be zero if
 * the layout's visibility is GONE
 * @param layout
 * @return
 */
public static int getFullHeight(ViewGroup layout) {
    int specWidth = View.MeasureSpec.makeMeasureSpec(0 /* any */, View.MeasureSpec.UNSPECIFIED);
    int specHeight = View.MeasureSpec.makeMeasureSpec(0 /* any */, View.MeasureSpec.UNSPECIFIED);


    layout.measure(specWidth,specHeight);
    int totalHeight = 0;//layout.getMeasuredHeight();
    int initialVisibility = layout.getVisibility();
    layout.setVisibility(View.VISIBLE);
    int numberOfChildren = layout.getChildCount();
    for(int i = 0;i<numberOfChildren;i++) {
        View child = layout.getChildAt(i);
        if(child instanceof ViewGroup) {
            totalHeight+=getFullHeight((ViewGroup)child);
        }else {
            int desiredWidth = View.MeasureSpec.makeMeasureSpec(layout.getWidth(),
                    View.MeasureSpec.AT_MOST);
            child.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
            totalHeight+=child.getMeasuredHeight();
        }

    }
    layout.setVisibility(initialVisibility);
    return totalHeight;
}

您可以在GitHub上查看手风琴组件和动画:​​Android Accordion View