我的一个DialogFragment布局使用HorizontalScrollView
水平滚动其子LinearLayout
。有没有办法将其宽度锁定到位,以便在使用项目填充LinearLayout后它不会扩展DialogFragment的宽度?
以下是DialogFragment
首次加载时的样子:
以下是汉字标题下的LinearLayout
填充项目时会发生的情况:
填充项目后,所有内容都会滚动,但我希望阻止DialogFragment
扩展。在HorizontalScrollView
的根目录上设置固定宽度会阻止它扩展,但考虑到Android屏幕的高度可变大小,我无法想到这样做的好方法。
以下是汉字下区域的一些代码:
<HorizontalScrollView
android:layout_height="48dp"
android:layout_width="match_parent">
<LinearLayout
android:id="@+id/grid_kanji"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" />
</HorizontalScrollView>
答案 0 :(得分:0)
通过将HorizontalScrollView
的宽度设置为对话框首次打开时的宽度,我获得了所需的效果:
// Fix the size of the HorizontalScrollView so it doesn't expand
HorizontalScrollView hsv = (HorizontalScrollView) getDialog().findViewById(R.id.grid_kanji_root);
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, (float) hsv.getHeight(), getResources().getDisplayMetrics());
int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, (float) hsv.getWidth(), getResources().getDisplayMetrics());
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width, height);
hsv.setLayoutParams(lp);
getWidth()
和getHeight()
以像素为单位返回度量值,这就是我的TypedValue
使用COMPLEX_UNIT_PX
而不是COMPLEX_UNIT_DP
的原因。
请注意,您无法在onCreateDialog()
或onResume()
中执行此操作,因为返回的宽度将为0(零)。我最终在函数中运行此代码,该函数将游标结果加载到子LinearLayout
中,并使用全局布尔值跟踪我是否已设置宽度 - 如果它是FALSE
(如同对话框首先加载),然后我设置宽度并将布尔值设置为TRUE
。
我还发现应用于控件的LayoutParams
必须与 parent 元素的类型匹配。由于我的HorizontalScrollView
位于LinearLayout
内,因此我必须将LinearLayout.LayoutParams
应用于HorizontalScrollView.LayoutParams
,而不是{{1}}。否则,您将获得 ClassCast异常。