我在ScrollView中有一个表单。当我点击EditText时,软键盘出现,ScrollView滚动现在聚焦的EditText,以便它进入视图。
但是,我在下面我想要显示的EditText提示信息,所以滚动应该更进一步,如下所示:
EditText嵌入在表单元素中,实际上我想滚动到底部。我已经检查过ScrollView的源代码,它只会滚动到当前焦点视图的底部。也许有一种方法可以告诉ScrollView表单元素是当前关注的元素吗?
当然,我可以编写自己的ScrollView子类并覆盖滚动行为,但我想知道是否有更优雅的方法。
任何其他建议(使用固定偏移调整滚动等)也是值得赞赏的。
答案 0 :(得分:6)
我还没有找到任何方法从外部配置ScrollView的滚动行为。所以我最终定义了我自己的ScrollView子类:`
/**
* {@link ScrollView} extension that allows to configure scroll offset.
*/
public class ConfigurableScrollView extends ScrollView {
private int scrollOffset = 0;
public ConfigurableScrollView (final Context context, final AttributeSet attrs) {
super(context, attrs);
}
public void setScrollOffset (final int scrollOffset) {
this.scrollOffset = scrollOffset;
}
@Override
protected int computeScrollDeltaToGetChildRectOnScreen (final Rect rect) {
// adjust by scroll offset
int scrollDelta = super.computeScrollDeltaToGetChildRectOnScreen(rect);
int newScrollDelta = (int) Math.signum(scrollDelta) * (scrollDelta + this.scrollOffset);
return newScrollDelta;
}
}
除了computeScrollDelta(...)
之外, onSizeChanged(...)
是唯一可以作为覆盖目标的受保护方法。
上面示例中的signum函数确保仅在ScrollView确实认为需要滚动时才会增加滚动(例如,当键盘弹出时)。
我现在可以从外部设置一次额外的滚动偏移量,根据提示的高度计算。
使用扩展的ConfigurableScrollView而不是标准的ScrollView并不难,我只需要用新类的FQN替换ScrollView XML标记。
答案 1 :(得分:0)
考虑到您使用的是ScrollView,您可以使用ScrollTo方法,如下所示:
scrollView.post(new Runnable() {
@Override
public void run() {
sv.scrollTo(x-value, y-value);
}
});
其中第一个参数是X的滚动值,而第二个参数是Y的滚动值。因此,您只需在显示键盘时设置scrollView偏移量。
希望它有所帮助;)