【问题标题】:ScrollView doesn't scrolls if soft keyboard is visible如果软键盘可见,则 ScrollView 不会滚动
【发布时间】:2012-07-01 02:39:45
【问题描述】:

我正在为登录屏幕使用简单的布局,其中包含顶部的栏和用户登录或进入注册活动所需的项目。

在虚拟键盘出现之前,所有元素都很好地适应屏幕。 Android 软键盘遮住了表单的一部分,我想使用 ScrollView 以便用户可以滚动并能够看到所有元素。

但是,即使使用 ScrollView,我也无法滚动查看页面底部:

<?xml version="1.0" encoding="utf-8"?>

<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true" >
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFCB05"
android:orientation="vertical"
android:isScrollContainer="true"
android:gravity="top" >

<include
    android:id="@+id/include1"
    android:layout_width="fill_parent"
    android:layout_height="50dip"
    layout="@layout/actionbar_layout" />

<LinearLayout 
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
android:orientation="vertical"
android:gravity="center_vertical"
android:layout_below="@+id/include1"
 >



<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="@string/usuario"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="#000000" />

    <EditText
        android:id="@+id/txtUsuario"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="5dp"
        android:ems="10"
        android:hint="@string/usuario" />
</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_marginTop="15dip" >

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:text="@string/senha"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="#000000" />

    <EditText
        android:id="@+id/txtSenha"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView2"
        android:layout_centerVertical="true"
        android:layout_marginTop="5dip"
        android:ems="10"
        android:hint="@string/senha"
        android:inputType="textPassword" />
</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:gravity="right" >

    <Button
        android:id="@+id/logarBtn"
        android:layout_width="93dp"
        android:layout_height="wrap_content"
        android:layout_marginRight="30dip"
        android:layout_marginTop="15dip"
        android:layout_marginBottom="15dip"
        android:text="@string/logar" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:gravity="center_horizontal" >

    <TextView
        android:id="@+id/registerBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/logarBtn"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dip"
        android:layout_marginBottom="60dip"
        android:linksClickable="true"
        android:text="@string/cadastrar"
        android:textColor="#0000CC"
        android:textSize="18dp" />
</LinearLayout>

</LinearLayout>

</RelativeLayout>
</ScrollView>

我想我可以这样做:Android Soft Keyboard Obscures EditTexts in ScrollView,但这似乎不是最佳做法。

有谁知道让它正确滚动的更好方法?

【问题讨论】:

  • 不应该在 EditText 外部单击以从屏幕上删除软键盘吗?当输入字段失去焦点时,它不是设计来做的吗?
  • 只有当我触摸另一个 EditText 或 Button 时,我的 EditText 才会失去焦点,因此软键盘会不断出现。

标签: android android-layout scrollview


【解决方案1】:
public class CustomScrollView extends ScrollView {

  private int scrollOffset = 0;

  public CustomScrollView (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;
  }
}

使用此自定义滚动视图而不是普通滚动视图。改变scrollOffset的值来达到想要的效果(scrollOffset = 10表示打开软键盘时会向下滚动额外的10dp)确保在activity中添加android:windowSoftInputMode="adjustResize"

【讨论】:

    【解决方案2】:

    查看以下链接:

    Android: ScrollView not scrolling with keyboard out

    这个解决方案对我有用。

    【讨论】:

      【解决方案3】:

      理想的做法如下。

      android:windowSoftInputMode="adjustResize"
      

      但是,当视图已经适合屏幕时,即使软键盘打开,滚动也会被禁用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-25
        • 2018-12-08
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多