软键盘打开时调整滚动位置

时间:2014-07-15 09:08:46

标签: android android-layout

我在ScrollView中有一个表单。当我点击EditText时,软键盘出现,ScrollView滚动现在聚焦的EditText,以便它进入视图。

Current scroll behavior

但是,我在下面我想要显示的EditText提示信息,所以滚动应该更进一步,如下所示:

Desired scroll behavior

EditText嵌入在表单元素中,实际上我想滚动到底部。我已经检查过ScrollView的源代码,它只会滚动到当前焦点视图的底部。也许有一种方法可以告诉ScrollView表单元素是当前关注的元素吗?

当然,我可以编写自己的ScrollView子类并覆盖滚动行为,但我想知道是否有更优雅的方法。

任何其他建议(使用固定偏移调整滚动等)也是值得赞赏的。

2 个答案:

答案 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偏移量。

希望它有所帮助;)