简体   繁体   English

如果可以看到软键盘,则ScrollView不会滚动

[英]ScrollView doesn't scrolls if soft keyboard is visible

I'm using a simple layout for a login screen which contains a bar at the top and the necessary items for user to login or go to the sign up activity. 我在登录屏幕上使用了一个简单的布局,其中包含顶部的栏和用户登录或转到注册活动所需的项目。

All the elements fit nicely on the screen until the virtual keyboard appears. 所有元素都很好地适合屏幕,直到出现虚拟键盘。 The Android soft keyboard obscures part of the form, and I want to use a ScrollView so the user can scroll and be able to see all the elements. Android软键盘模糊了表单的一部分,我想使用ScrollView,以便用户可以滚动并能够看到所有元素。

But, even with ScrollView, I can't scroll to see the bottom of the page: 但是,即使使用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>

I think I could do this: Android Soft Keyboard Obscures EditTexts in ScrollView but it doesn't seem like the best practice. 我想我可以这样做: Android软键盘在ScrollView中模糊EditTexts但它似乎不是最好的做法。

Does anyone know of a better way to make it scroll properly? 有没有人知道更好的方法让它正确滚动?

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;
  }
}

Use this Custom Scroll View instead of the normal Scroll View. 使用此自定义滚动视图而不是普通的滚动视图。 Change the value of scrollOffset to achieve the desired result (scrollOffset = 10 means extra 10dp will be scrolled down when soft keyboard opens) Make sure android:windowSoftInputMode="adjustResize" is added in the activity 更改scrollOffset的值以获得所需的结果(scrollOffset = 10表示软键盘打开时将向下滚动额外的10dp)确保在活动中添加了android:windowSoftInputMode="adjustResize"

Check out the following link: 查看以下链接:

Android: ScrollView not scrolling with keyboard out Android:ScrollView不会滚动键盘输出

This solution worked for me. 这个解决方案对我有用。

Ideal way of doing it is below. 这样做的理想方式如下。

android:windowSoftInputMode="adjustResize"

But, when views are already fitting inside a screen, even if softkeypad opens up scrolling will be disabled. 但是,当视图已经适合屏幕内部时,即使打开了软键盘,也会禁用滚动。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM