Horizo​​ntalScrollView的中心要素不足以使其滚动时

我有一个包含LinearLayoutHorizontalScrollView布局,其中的内容是用DB的内容膨胀的。 这工作正常,但是当没有足够的元素,使HSV滚动这并不填补屏幕的宽度,理想情况下应该居中。 即目前:

 | Element 1 Element 2 | <- edge of screen 

代替:

 | Element 1 Element 2 | <- edge of screen 

同时仍然能够:

 | Element 1 Element 2 Element 3 Element 4 Elem| <- edge of screen now scrolling 

布局XML是:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mainLinearLayout" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/header" android:layout_width="fill_parent" android:layout_height="25dp" > </TextView> <ScrollView android:id="@+id/scroll1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" > <LinearLayout android:id="@+id/contentLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > </LinearLayout> </ScrollView> <HorizontalScrollView android:id="@+id/horizontalScrollView1" android:layout_width="fill_parent" android:layout_height="30dp"> <LinearLayout android:id="@+id/footerLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > </LinearLayout> </HorizontalScrollView> </LinearLayout> 

在footerLayout中使用以下XML进行充气:

 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/footer_content" android:textSize="18sp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingLeft="5dp" android:paddingRight="5dp" android:text="FOOTER" android:singleLine="true" /> 

任何帮助将不胜感激。

Solutions Collecting From Web of "Horizo​​ntalScrollView的中心要素不足以使其滚动时"

我刚刚解决了这个问题。 我几个小时前遇到它。 您需要将Horizo​​ntalScrollView居中放在其父项中,并将其宽度/高度设置为wrap_content。 您在HSV中放置的布局必须将其宽度/高度设置为包装内容。 这里的重要部分是不要在这个布局上设置任何重力/ layout_gravity,或者在膨胀视图之后你可能会遇到(非常恼人的)剪切问题。 下面的例子包含在一个RelativeLayout中。

  <HorizontalScrollView android:id="@+id/svExample" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_below="@id/rlExample"> <LinearLayout android:id="@+id/llExample" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> </LinearLayout> </HorizontalScrollView > 

我有同样的问题,终于得到它的工作。 这是一个最小的例子:

Horizo​​ntalScrollView的主要活动布局:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <HorizontalScrollView android:layout_width="match_parent" android:layout_height="wrap_content" android:fillViewport="true" > <LinearLayout android:id="@+id/container" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > </LinearLayout> </HorizontalScrollView> </LinearLayout> 

将滚动并放入滚动视图中的元素的布局:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="your text" /> </LinearLayout> 

这是代码膨胀和添加元素的一个例子:

 LinearLayout container = (LinearLayout) findViewById(R.id.container); LayoutParams elementLayoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f); int elementCount = 3; // ...or however many you like for (int i = 0; i < elementCount; i++) { LinearLayout element = (LinearLayout) getLayoutInflater().inflate(R.layout.element, null); container.addView(element, elementLayoutParams); } 

它主要是基于一种技术来扩展Romain Guy在本文中所解释的ScrollView的内容。

但是,在这种情况下,要dynamic添加内容,另一个关键点是在将元素添加到容器时,使用LayoutParams设置权重的正值(本例中为1f)。 如果你有一组静态的元素可以直接包含在容器中而不需要膨胀,你可以在XML布局中指定元素的外部LinearLayout的权重,如下所示:

 android:layout_weight="1" 

但是,如果你dynamic地做到这一点,将无法正常工作,因为重量将重置为0,并且元素会崩溃。 因此,您需要通过LayoutParams进行设置。

设法得到左侧的中央水平裁剪:

Horizo​​ntalScrollView布局的一部分已被更改为:

 <LinearLayout android:id="@+id/footerWrapperLayoutToGetAroundCenteringIssue" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="50dp" android:gravity="center_horizontal"> <HorizontalScrollView android:id="@+id/horizontalScrollView1" android:layout_height="fill_parent" android:layout_width="wrap_content"> <LinearLayout android:id="@+id/footerLayout" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> </LinearLayout> </HorizontalScrollView> </LinearLayout> 

它只是一个可惜的时候,它集中他们不均匀分布。

如果有人有任何想法,请让我知道。

下面是对我来说最简单的方法。

 <HorizontalScrollView android:id="@+id/horizontalScrollView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"> <LinearLayout android:id="@+id/layout_others" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </HorizontalScrollView> 

在膨胀的视图中将文本视图分配给textview并使宽度包含内容