将TableLayout中的TextView滚动到屏幕的可见区域

时间:2012-12-22 22:40:32

标签: java android-widget scrollview

如果TextView不是ScrollView的直接子项,如何通过滚动TextViewScrollView放入屏幕的可见区域?< / 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代码生成,我只添加了一行作为插入内容的示例。

我现在需要确保通过垂直滚动显示某一行(不一定是最后一行)。我可以访问从sc的每个元素,但我无法弄清楚要进行ScrollView s滚动的代码。

我尝试了requestChildRectangleOnScreenscrollByscrollTo,但可能总是使用错误的参数。

现在我不关心TextView a是垂直居中还是位于底部或顶部边界,如果它完全可见则确实很好。 X-scroll应该保持0,理想情况下(即最左边的位置)。

如果这很重要:只有当用户使用特殊的Intent进入屏幕时才会调用此函数,该Intent告诉屏幕滚动到TableRow x(它只是为了显示最新的更改)。

如果您需要更多信息,请询问。

谢谢!

1 个答案:

答案 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
    }
});