【问题标题】:Focus ScrollView to selected position programmatically - Android以编程方式将 ScrollView 聚焦到选定位置 - Android
【发布时间】:2013-08-13 20:03:53
【问题描述】:

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

我发现了一些像 scrollTo() 这样的函数可以将 ScrollView 聚焦在顶部、按钮或类似的位置,但我想将 ScrollView 聚焦在某些位置,例如下面屏幕截图中显示 Level 8 的按钮 ID。我该怎么做呢?

【问题讨论】:

标签: java android scrollview


【解决方案1】:

使用此代码,取自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);
    }
});

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

【讨论】:

  • 当您的答案回答了 2 个问题时,这表明这些问题实际上是重复的。在这种情况下,您应该标记问题,而不是两次发布您的答案。
【解决方案2】:

使用此代码,取自this answer

private final void focusOnView(){
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                your_scrollview.scrollTo(0, your_EditBox.getBottom());
            }
        });
    }

【讨论】:

    【解决方案3】:

    我认为这应该足够了:

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

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

    child - 这个 ViewParent 的想要获得焦点的孩子。此视图将包含焦点视图。它不一定是真正具有焦点的视图。

    focused - 实际上具有焦点的 child 的后代视图

    【讨论】:

      【解决方案4】:

      试试这个

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

      x X 轴上滚动的位置

      y Y轴上滚动的位置

      【讨论】:

        【解决方案5】:

        我同意先前答案的好处。但是,根据经验,我发现这比这更复杂。 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);
        }});
        

        【讨论】:

          【解决方案6】:

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

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

          参考this question

          【讨论】:

            【解决方案7】:

            见: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;
                    }
                }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-09-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-04-22
              相关资源
              最近更新 更多