如果TextView
不是ScrollView
的直接子项,如何通过滚动TextView
将ScrollView
放入屏幕的可见区域?< / p>
我的LinearLayout
视图顶部有TextView
,后面是ScrollView
,低于Button
:
<LinearLayout
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_height="wrap_content"/>
<ScrollView
android:id="@+id/s"
android:layout_height="0dip"
android:layout_weight="1" >
<TableLayout
android:id="@+id/t"
android:layout_height="wrap_content" >
<TableRow
android:id="@+id/r" >
<TextView
android:id="@+id/a"/>
<TextView
android:id="@+id/b"/>
<TextView
android:id="@+id/c"/>
</TableRow>
</TableLayout>
</ScrollView>
<Button
android:layout_height="wrap_content"/>
</LinearLayout>
生成一个完全填满的屏幕,顶部边框处的标签,底部边框处的按钮以及它之间的表格;根据此表的行数,您可以滚动或不滚动。
表的内容由Java代码生成,我只添加了一行作为插入内容的示例。
我现在需要确保通过垂直滚动显示某一行(不一定是最后一行)。我可以访问从s
到c
的每个元素,但我无法弄清楚要进行ScrollView s
滚动的代码。
我尝试了requestChildRectangleOnScreen
,scrollBy
和scrollTo
,但可能总是使用错误的参数。
现在我不关心TextView a
是垂直居中还是位于底部或顶部边界,如果它完全可见则确实很好。 X-scroll应该保持0,理想情况下(即最左边的位置)。
如果这很重要:只有当用户使用特殊的Intent进入屏幕时才会调用此函数,该Intent告诉屏幕滚动到TableRow
x(它只是为了显示最新的更改)。
如果您需要更多信息,请询问。
谢谢!
答案 0 :(得分:0)
问题确实是我直接从onCreate
的子调用中调用了该函数。这意味着布局尚未完成,因此所有滚动都是在元素具有高度之前完成的,因此它滚动了0像素。
解决方案是使用View.post(Runnable r)
:
ScrollView s = (ScrollView) findViewById(R.id.s);
TextView a = (TextView) findViewById(R.id.a);
s.post(new Runnable() {
public void run() {
int[] location = new int[2];
a.getLocationInWindow(location);
int y = location[1];
s.getLocationInWindow(location);
s.scrollTo(0, y-location[1]); // or some other calculation
}
});