簡體   English   中英

打開軟鍵盤時調整滾動位置

[英]Adjust scroll position when soft keyboard opens

我在ScrollView中有一個表單。 當我點擊EditText時,會出現軟鍵盤,並且ScrollView會滾動現在聚焦的EditText,以便它進入視圖。

當前滾動行為

但是,我也想顯示在EditText 下方的提示信息,因此滾動應該往上一點,如下所示:

所需的滾動行為

EditText嵌入在表單元素中,實際上,我想滾動到其底部。 我已經檢查了ScrollView的源代碼,它只會滾動到當前焦點視圖的底部。 也許有一種方法可以告訴ScrollView form元素是當前焦點的元素?

當然,我可以編寫自己的ScrollView子類並覆蓋滾動行為,但是我想知道是否有更優雅的方法來做到這一點。

任何其他建議(以固定偏移量左右調整滾動)也應受到贊賞。

我還沒有真正找到從外部配置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;
  }
}

除了onSizeChanged(...)之外, computeScrollDelta(...)是唯一可以覆蓋的受保護方法。

上面的示例中的signum函數可確保僅在ScrollView確實認為需要滾動時(例如,在彈出鍵盤時)才增加滾動。

現在,我可以根據提示的高度從外部設置一次額外的滾動偏移量。

使用擴展的ConfigurableScrollView而不是標准的ScrollView並不難,我只需要用新類的FQN替換ScrollView XML標記即可。

考慮到您正在使用ScrollView,可以使用ScrollTo方法,如下所示:

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

其中第一個參數是X的滾動值,而第二個參數是Y的滾動值。因此,只需要在顯示鍵盤時設置您的scrollView偏移量即可。

希望能幫助到你;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM