以编程方式将ScrollView聚焦到选定位置 - Android

时间:2013-08-12 13:26:30

标签: java android scrollview

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

enter image description here

我发现像scrollTo()这样的函数可以将ScrollView集中在顶部,按钮或类似的东西但是我想将ScrollView集中在某些地方,例如Level 8所示的按钮ID下面的截图。我该怎么做呢?

7 个答案:

答案 0 :(得分:2)

我认为这应该足够好了:

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

public void RequestChildFocus(View child,View focused)

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

专注 - 作为实际拥有焦点的儿童后代的视图

答案 1 :(得分:1)

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

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

                yourScrollView.scrollTo(x, y);

参考this question

答案 2 :(得分: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);
}});

答案 3 :(得分: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;
        }
    }

答案 4 :(得分:0)

试试这个

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

x在X轴上滚动的位置

y在Y轴上滚动的位置

答案 5 :(得分:0)

使用此代码,取自this answer

Traceback (most recent call last):
  File "<FOLDERSYSTEM>/main.py", line 36, in <module>
    newpassword = hashlib.sha224(newpassword).hexdigest()
TypeError: Unicode-objects must be encoded before hashing

答案 6 :(得分:0)

使用此代码,摘自my another answer

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

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