Java 以编程方式将焦点滚动视图移动到选定位置-Android

Java 以编程方式将焦点滚动视图移动到选定位置-Android,java,android,scrollview,Java,Android,Scrollview,我有一个带有很多按钮的滚动视图。当用户解锁该按钮/级别时,每个按钮都将启用。我想将滚动视图的焦点放在最新的解锁按钮/级别上。请参见下面的屏幕截图 我发现一些像scrollTo这样的功能可以将ScrollView的焦点放在顶部、按钮或类似的地方,但我想将ScrollView的焦点放在某些地方,比如下面屏幕截图中显示级别8的按钮ID。我该怎么做呢?请参阅:,int “int selectedLevel”保存当前选定的级别,信息保存在级别类中。 “值”是一个包含所有级别的列表,由列表显示。 例如:

我有一个带有很多按钮的滚动视图。当用户解锁该按钮/级别时,每个按钮都将启用。我想将滚动视图的焦点放在最新的解锁按钮/级别上。请参见下面的屏幕截图

我发现一些像scrollTo这样的功能可以将ScrollView的焦点放在顶部、按钮或类似的地方,但我想将ScrollView的焦点放在某些地方,比如下面屏幕截图中显示级别8的按钮ID。我该怎么做呢?

请参阅:,int

“int selectedLevel”保存当前选定的级别,信息保存在级别类中。 “值”是一个包含所有级别的列表,由列表显示。 例如:

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

“int selectedLevel”保存当前选定的级别,信息保存在级别类中。 “值”是一个包含所有级别的列表,由列表显示。 例如:

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

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

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

                yourScrollView.scrollTo(x, y);

请参阅

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

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

                yourScrollView.scrollTo(x, y);

参考

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

如果从活动生命周期方法中执行,则视图尚未加载/配置。 列表移动操作后触发的视图修改似乎会中断移动。由于视图的重新计算,可能会在移动完成之前覆盖某些值。 这种推理似乎适用于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);
}});

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

如果从活动生命周期方法中执行,则视图尚未加载/配置。 列表移动操作后触发的视图修改似乎会中断移动。由于视图的重新计算,可能会在移动完成之前覆盖某些值。 这种推理似乎适用于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);
}});
试试这个

sc.post(new Runnable() { 
        public void run() { 
             sc.smoothScrollTo(x, y);
        } 
    });
x在x轴上滚动的位置

y在y轴上滚动的位置

试试这个

sc.post(new Runnable() { 
        public void run() { 
             sc.smoothScrollTo(x, y);
        } 
    });
x在x轴上滚动的位置


y在y轴上滚动的位置

我认为这应该足够好了:

  yourButtonView.getParent().requestChildFocus(yourButtonView,yourButtonView);
public void RequestChildFocus视图子对象,以视图为中心

child-此ViewParent的需要焦点的子级。此视图将包含聚焦视图。它不一定是真正有焦点的观点


聚焦-孩子的后代实际上拥有聚焦的观点,我认为这应该足够好了:

  yourButtonView.getParent().requestChildFocus(yourButtonView,yourButtonView);
public void RequestChildFocus视图子对象,以视图为中心

child-此ViewParent的需要焦点的子级。此视图将包含聚焦视图。它不一定是真正有焦点的观点


聚焦-实际具有聚焦的子视图的后代使用以下代码,取自


使用此代码,取自


使用此代码,取自

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

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

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

使用取自

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

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个问题时,这表明这些问题实际上是重复的。在这种情况下,您应该标记问题,
不要发布两次你的答案。每当你的答案回答两个问题时,这表明这些问题实际上是重复的。在这种情况下,你应该标记问题,而不是张贴你的答案两次。