软键盘弹出时调整滚动位置

3
我有一个在ScrollView中的表单。当我点击EditText时,软键盘会出现,然后ScrollView会滚动以便现在聚焦的EditText正好出现在可视范围内。
但是,我有提示信息就在EditText下方,我也想显示它,所以滚动应该向上移动一点,像这样:
EditText嵌入在一个表单元素中,实际上我想滚动到该表单元素的底部。我已经检查了ScrollView的源代码,它只会滚动到当前聚焦的视图的底部。也许有一种方法可以告诉ScrollView表单元素是当前聚焦的元素吗?
当然,我可以编写自己的ScrollView子类并覆盖滚动行为,但我想知道是否有更优雅的方法来实现这一点。
也欢迎任何其他建议(使用固定偏移量调整滚动等)。

在滚动视图中,为您的视图从底部留出边距。 - Pankaj Arora
请在AndroidManifest.xml文件中的activity标签中添加android:windowSoftInputMode="stateHidden|adjustResize"属性。 - Haresh Chhelana
2个回答

8

我并没有找到一种从外部配置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(...)
上面示例中的符号函数确保只有在ScrollView真正认为需要滚动时(例如当键盘弹出时),才会增加滚动量。
现在我可以从外部设置额外的滚动偏移量,该偏移量根据提示的高度计算得出。
使用扩展的ConfigurableScrollView而不是标准的ScrollView并不难,我只需要将ScrollView XML标记替换为新类的FQN即可。

0

考虑到您正在使用ScrollView,您可以按照以下方式使用ScrollTo方法:

        scrollView.post(new Runnable() {
            @Override
            public void run() {
                sv.scrollTo(x-value, y-value);
            }
        });

第一个参数是X轴的滚动值,而第二个参数是Y轴的滚动值。因此,当键盘显示时,您只需设置scrollView的偏移量即可。

希望能帮到您;)


我调查了这种可能性,对于我的情况来说,使用scrollBy(dx,dy)甚至更好。然而,这种解决方案的问题在于首先必须检测软键盘是否正在显示。虽然通过在ScrollView上使用OnLayoutChangedListener(如果dy大于例如200px,则键盘正在显示)很容易实现,但它有些不稳定(当焦点改变时,其他带有动画的东西会导致不断的布局更改,必须进行区分),并且不太实用。 - cheppsn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接