我可以阻止Horizo​​ntalScrollView扩展吗?

时间:2013-10-11 21:00:37

标签: android android-layout android-linearlayout horizontalscrollview

我的一个DialogFragment布局使用HorizontalScrollView水平滚动其子LinearLayout。有没有办法将其宽度锁定到位,以便在使用项目填充LinearLayout后它不会扩展DialogFragment的宽度?

以下是DialogFragment首次加载时的样子: DialogFragment - First Load

以下是汉字标题下的LinearLayout填充项目时会发生的情况: DialogFramgnet - Items populated

填充项目后,所有内容都会滚动,但我希望阻止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>

1 个答案:

答案 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异常