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

目前,我有一个这样的布局。 它包含。

  • 标题文本视图和价格文本视图,始终可见。
  • 说明文本视图 ,可以显示或不显示,具体取决于展开或折叠。

折叠(在应用程序启动过程中)

在这里输入图像说明

展开(当用户点击它时)

在这里输入图像说明

我想围绕它有一些不错的animation。 所以,我提到https://stackoverflow.com/a/13381228/72437

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

但是,我意识到一些types的代码。 他们不准确

// 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)。 这是第一行文本的高度。 这结束了我的animation结束于

在这里输入图像说明

我可否知道,甚至在从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> 

Solutions Collecting From Web of "准确的方法来确定一个视图的测量高度,甚至在它从GONE变为VISIBLE之前"

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

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

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

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

我为我的手风琴部分完成了这个任务。 我面临着同样的问题,即扩大我的手风琴,这需要“目的地”的高度,也就是扩展后需要的高度。 这将返回正确的高度:

 /*** * 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上查看手风琴组件和animation