Java 以编程方式将焦点滚动视图移动到选定位置-Android
我有一个带有很多按钮的滚动视图。当用户解锁该按钮/级别时,每个按钮都将启用。我想将滚动视图的焦点放在最新的解锁按钮/级别上。请参见下面的屏幕截图 我发现一些像scrollTo这样的功能可以将ScrollView的焦点放在顶部、按钮或类似的地方,但我想将ScrollView的焦点放在某些地方,比如下面屏幕截图中显示级别8的按钮ID。我该怎么做呢?请参阅:,int “int selectedLevel”保存当前选定的级别,信息保存在级别类中。 “值”是一个包含所有级别的列表,由列表显示。 例如:Java 以编程方式将焦点滚动视图移动到选定位置-Android,java,android,scrollview,Java,Android,Scrollview,我有一个带有很多按钮的滚动视图。当用户解锁该按钮/级别时,每个按钮都将启用。我想将滚动视图的焦点放在最新的解锁按钮/级别上。请参见下面的屏幕截图 我发现一些像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个问题时,这表明这些问题实际上是重复的。在这种情况下,您应该标记问题,
不要发布两次你的答案。每当你的答案回答两个问题时,这表明这些问题实际上是重复的。在这种情况下,你应该标记问题,而不是张贴你的答案两次。