约束布局滚动到底部,键盘打开

时间:2017-05-09 06:41:39

标签: android android-layout android-constraintlayout

我正在使用ConstraintLayout来设计注册屏幕。我已将ConstraintLayout放在滚动视图中。即使键盘打开,用户也应该能够滚动和查看整个内容。我使用RelativeLayout时此功能有效,但在使用ConstraintLayout时无效。位于屏幕底部的视图隐藏在键盘后面。以下是我正在使用的布局。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    android:paddingTop="23dp"
    android:fillViewport="true"
    tools:context="com.givhero.activities.LoginActivity">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="bottom"
        tools:context="com.givhero.activities.LoginActivity">

        <ImageView
            android:id="@+id/back"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="15dp"
            android:src="@drawable/back"
            android:tint="@color/colorPrimary"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:layout_editor_absoluteX="0dp"/>
        <TextView
            android:id="@+id/regEmail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:paddingLeft="10dp"
            android:text="@string/sign_up_email"
            android:textColor="@color/colorPrimary"
            android:textSize="@dimen/titles_lists"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/back"
            tools:layout_editor_absoluteX="0dp"/>

        <TextView
            android:id="@+id/nameEditText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginEnd="15dp"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:layout_marginStart="15dp"
            android:layout_marginTop="30dp"
            android:background="@android:color/transparent"
            android:gravity="left"
            android:hint="Name"
            android:textColor="@color/dark"
            android:textColorHint="@color/dark"
            android:textSize="@dimen/base"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/regEmail"
            />

        <View
            android:id="@+id/nameDivider"
            android:layout_width="0dp"
            android:layout_height="1dp"
            android:layout_marginTop="15dp"
            android:background="@color/divider"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/nameEditText"
            />

        <EditText
            android:id="@+id/emailEditText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginEnd="15dp"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:layout_marginStart="15dp"
            android:layout_marginTop="30dp"
            android:background="@android:color/transparent"
            android:gravity="left"
            android:hint="Email"
            android:inputType="textEmailAddress"
            android:textColor="@color/dark"
            android:textColorHint="@color/dark"
            android:textSize="@dimen/base"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/nameDivider"
            />

        <View
            android:id="@+id/emailDivider"
            android:layout_width="0dp"
            android:layout_height="1dp"
            android:layout_marginTop="15dp"
            android:background="@color/divider"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/emailEditText"/>

        <Button
            android:id="@+id/submitButton"
            android:layout_width="0dp"
            android:layout_height="62dp"
            android:layout_marginEnd="15dp"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:layout_marginStart="15dp"
            android:layout_marginTop="30dp"
            android:background="@drawable/button_theme"
            android:enabled="false"
            android:text="@string/sign_up"
            android:textColor="#FFFFFF"
            android:textSize="@dimen/base"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/emailDivider"
            />

        <TextView
            android:id="@+id/signUpMessage"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_margin="30dp"
            android:padding="15dp"
            android:text="@string/sign_up_message"
            android:textColor="@color/dark80Opacity"
            android:textSize="@dimen/medium12"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/submitButton"
            />
    </android.support.constraint.ConstraintLayout>
</ScrollView>

我在Manifest中添加了以下内容。

<activity android:name=".activities.EmailSignupActivity"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustResize">
        </activity>

虽然它没有按预期滚动。以下是更好理解的屏幕截图

enter image description here

如您所见,我在EditText字段和注册按钮下面有一些文字。我期待的是即使键盘打开,用户也应该能够滚动到页面底部以查看该文本。键盘打开时请检查以下屏幕截图

enter image description here

键盘打开时无法滚动视图。

EDIT 哎,

如果有人遇到这个问题并在这里找到答案。我终于可以找到它的解决方案。我无法弄清楚这个问题的确切原因,但可以找出导致布局不滚动的原因。最初,我一直试图占据整个屏幕,包括设计状态栏,并在oncreate中使用以下内容

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

以上一行导致了这个问题,一旦我删除它,我就可以滚动布局了。如果我们占据包括设计状态栏在内的全屏幕,我很乐意找到布局不滚动的原因。

3 个答案:

答案 0 :(得分:2)

在活动的清单中添加此内容。

android:windowSoftInputMode="stateVisible|adjustResize"

答案 1 :(得分:2)

您可以使用 RelativeLayout 中的 ConstraintLayout 来使用 ScrollView 。将 fillViewport 提供给 ScrollView 。我只是改变你的代码,就像我用来做的那样。你应该在键盘打开时给marginBottom滚动。试试看。希望它有所帮助。

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

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
android:paddingTop="23dp"
tools:context="com.givhero.activities.LoginActivity">

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="bottom"
    tools:context="com.givhero.activities.LoginActivity">

    <ImageView
        android:id="@+id/back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="15dp"
        android:src="@drawable/back"
        android:tint="@color/colorPrimary"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="0dp"/>
    <TextView
        android:id="@+id/regEmail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:paddingLeft="10dp"
        android:text="@string/sign_up_email"
        android:textColor="@color/colorPrimary"
        android:textSize="@dimen/titles_lists"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/back"
        tools:layout_editor_absoluteX="0dp"/>

    <TextView
        android:id="@+id/nameEditText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="15dp"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp"
        android:layout_marginStart="15dp"
        android:layout_marginTop="30dp"
        android:background="@android:color/transparent"
        android:gravity="left"
        android:hint="Name"
        android:textColor="@color/dark"
        android:textColorHint="@color/dark"
        android:textSize="@dimen/base"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/regEmail"
        />

    <View
        android:id="@+id/nameDivider"
        android:layout_width="0dp"
        android:layout_height="1dp"
        android:layout_marginTop="15dp"
        android:background="@color/divider"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/nameEditText"
        />

    <EditText
        android:id="@+id/emailEditText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="15dp"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp"
        android:layout_marginStart="15dp"
        android:layout_marginTop="30dp"
        android:background="@android:color/transparent"
        android:gravity="left"
        android:hint="Email"
        android:inputType="textEmailAddress"
        android:textColor="@color/dark"
        android:textColorHint="@color/dark"
        android:textSize="@dimen/base"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/nameDivider"
        />

    <View
        android:id="@+id/emailDivider"
        android:layout_width="0dp"
        android:layout_height="1dp"
        android:layout_marginTop="15dp"
        android:background="@color/divider"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/emailEditText"/>

    <Button
        android:id="@+id/submitButton"
        android:layout_width="0dp"
        android:layout_height="62dp"
        android:layout_marginEnd="15dp"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp"
        android:layout_marginStart="15dp"
        android:layout_marginTop="30dp"
        android:background="@drawable/button_theme"
        android:enabled="false"
        android:text="@string/signup"
        android:textColor="#FFFFFF"
        android:textSize="@dimen/base"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/emailDivider"
        />

    <TextView
        android:id="@+id/signUpMessage"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="30dp"
        android:padding="15dp"
        android:text="@string/sign_up_message"
        android:textColor="@color/dark80Opacity"
        android:textSize="@dimen/medium12"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/submitButton"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="16dp"/>

</android.support.constraint.ConstraintLayout>
</ScrollView>
</RelativeLayout>

答案 2 :(得分:0)

您必须在windowSoftInputMode文件的Activity上设置Manifest

android:windowSoftInputMode="stateVisible|adjustResize"

(或android:windowSoftInputMode="stateHidden|adjustResize",如果您不希望在打开活动时显示键盘)

并使活动设计像这样

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            /* your elements here */

        </android.support.constraint.ConstraintLayout>
    </android.support.v4.widget.NestedScrollView
</FrameLayout>
相关问题