我有一个带有很多按钮的 ScrollView。当用户解锁该按钮/级别时,每个按钮都会启用。我想将 ScrollView 集中在最新的解锁按钮/级别上。请参阅下面的屏幕截图。
我发现一些类似scrollTo()
的功能可以将 ScrollView 集中在顶部、按钮或类似的位置,但我想将 ScrollView 集中在某些位置,例如Level 8
下面屏幕截图中的按钮 ID。我该怎么做呢?
我有一个带有很多按钮的 ScrollView。当用户解锁该按钮/级别时,每个按钮都会启用。我想将 ScrollView 集中在最新的解锁按钮/级别上。请参阅下面的屏幕截图。
我发现一些类似scrollTo()
的功能可以将 ScrollView 集中在顶部、按钮或类似的位置,但我想将 ScrollView 集中在某些位置,例如Level 8
下面屏幕截图中的按钮 ID。我该怎么做呢?
我认为这应该足够好了:
yourButtonView.getParent().requestChildFocus(yourButtonView,yourButtonView);
public void RequestChildFocus(查看孩子,查看重点)
child - 此 ViewParent 需要焦点的孩子。此视图将包含焦点视图。实际关注的不一定是视图。
聚焦- 实际具有焦点的孩子的后代视图
我同意以前答案的好处。但是,根据经验,我发现这比这更复杂。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);
}});
首先,一旦您知道可以使用以下代码使该项目成为焦点,您需要知道必须获得焦点的滚动项目的位置
final int x;
final int y;
x = rowview[pos].getLeft();
y = rowView[pos].getTop();
yourScrollView.scrollTo(x, y);
参考这个问题
请参阅:http: //developer.android.com/reference/android/widget/ListView.html#setSelectionFromTop (int , int)
Level
类中。例子:
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;
}
}
尝试这个
sc.post(new Runnable() {
public void run() {
sc.smoothScrollTo(x, y);
}
});
x 在 X 轴上滚动的位置
y 在 Y 轴上滚动的位置
使用此代码,取自我的另一个答案
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);
}
});
尝试后使用所需的代码块,或者根据需要使用。
使用此代码,取自此答案
private final void focusOnView(){
new Handler().post(new Runnable() {
@Override
public void run() {
your_scrollview.scrollTo(0, your_EditBox.getBottom());
}
});
}