2

我有一个带有很多按钮的 ScrollView。当用户解锁该按钮/级别时,每个按钮都会启用。我想将 ScrollView 集中在最新的解锁按钮/级别上。请参阅下面的屏幕截图。

在此处输入图像描述

我发现一些类似scrollTo()的功能可以将 ScrollView 集中在顶部、按钮或类似的位置,但我想将 ScrollView 集中在某些位置,例如Level 8下面屏幕截图中的按钮 ID。我该怎么做呢?

4

7 回答 7

2

我认为这应该足够好了:

  yourButtonView.getParent().requestChildFocus(yourButtonView,yourButtonView);

public void RequestChildFocus(查看孩子,查看重点)

child - 此 ViewParent 需要焦点的孩子。此视图将包含焦点视图。实际关注的不一定是视图。

聚焦- 实际具有焦点的孩子的后代视图

于 2015-08-01T17:42:17.237 回答
1

我同意以前答案的好处。但是,根据经验,我发现这比这更复杂。setSelectionFromTop 非常敏感,如果执行得太早,通常会中断。这可能取决于不同的原因,但两个主要原因是

  • 如果从 Activity 生命周期方法中执行,则尚未加载/配置视图。
  • 列表移动操作后触发的视图修改似乎中断了移动。由于重新计算视图,可能会在移动完成之前覆盖一些值。

推理似乎适用于 setSelectionFromTop 和 setSelection() 方法,尽管我主要使用 setSelectionFromTop 进行测试。smoothScrollToPosition() 似乎更健壮,可能是因为它根据定义更改了在进行平滑滚动时延迟的列表位置。

看这个示例源代码:

// Wee need to pospone the list move until all other view setup activities are finished
list.post(new Runnable(){
    @override
    public void run() {
        list.setSelectionFromTop(selectedPosition, Math.max(0, Math.round(list.getHeight() / 3))); // Make sure selection is in middle of page, if possible.
        // Make sure you do not modify (this or other) parts of the view afterwards - it may break the list move
        // activityButtons.setVisibility(View.GONE);
}});
于 2013-12-05T10:28:05.993 回答
1

首先,一旦您知道可以使用以下代码使该项目成为焦点,您需要知道必须获得焦点的滚动项目的位置

    final int x;
            final int y;
            x = rowview[pos].getLeft();
            y = rowView[pos].getTop();

                yourScrollView.scrollTo(x, y);

参考这个问题

于 2013-08-12T13:40:39.137 回答
0

请参阅:http: //developer.android.com/reference/android/widget/ListView.html#setSelectionFromTop (int , int)

  • 'int selectedLevel' 保存当前选择的级别,信息保存在一个Level类中。
  • 'values' 是一个包含所有级别的列表,由列表显示。

例子:

    ListView lv = (ListView)findViewById(android.R.id.list);
    int i = 0;
    for (Level l : values) {
        i++;
        if (l.level == selectedLevel) {
            lv.setSelectionFromTop(i, 200);
            break;
        }
    }
于 2013-08-12T13:39:27.247 回答
0

尝试这个

sc.post(new Runnable() { 
        public void run() { 
             sc.smoothScrollTo(x, y);
        } 
    });

x 在 X 轴上滚动的位置

y 在 Y 轴上滚动的位置

于 2014-01-07T07:51:45.277 回答
0

使用此代码,取自我的另一个答案

scrollViewSignup.post(new Runnable() {
    @Override
    public void run() {
        int scrollY = scrollViewSignup.getScrollY();
        scrollViewSignup.scrollTo(0, 0);
        final Rect rect = new Rect(0, 0, view.getWidth(), view.getHeight());
        view.requestRectangleOnScreen(rect, true);

        int new_scrollY = scrollViewSignup.getScrollY();
        scrollViewSignup.scrollTo(0, scrollY);
        scrollViewSignup.smoothScrollTo(0, new_scrollY);
    }
});

此代码尝试平滑滚动并使用系统的标准行为来定位项目。如果您不希望系统平滑滚动到该项目,您可以简单地使用 scrollTo 更改smoothScrollTo 。或者,您只能使用下面的代码。

scrollViewSignup.post(new Runnable() {
    @Override
    public void run() {
        scrollViewSignup.scrollTo(0, 0);
        final Rect rect = new Rect(0, 0, view.getWidth(), view.getHeight());
        view.requestRectangleOnScreen(rect, true);
    }
});

尝试后使用所需的代码块,或者根据需要使用。

于 2019-09-26T12:39:44.597 回答
0

使用此代码,取自此答案

private final void focusOnView(){
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                your_scrollview.scrollTo(0, your_EditBox.getBottom());
            }
        });
    }
于 2016-07-11T09:59:56.367 回答