0

如果a不是 a 的直接子级,我如何TextView通过滚动 a 进入屏幕的可见区域?ScrollViewTextViewScrollView

我有一个顶部有 a 的LinearLayout视图,然后是 a和下面的 a :TextViewScrollViewButton

<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我可以从to访问每个元素c,但我根本不知道进行ScrollView s滚动的代码。

我尝试过requestChildRectangleOnScreen,scrollBy和, scrollTo,但可能总是使用错误的论点。

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

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

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

谢谢!

4

1 回答 1

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
    }
});
于 2012-12-23T02:07:40.293 回答