登录按钮始终可见

时间:2016-01-26 10:54:22

标签: android android-layout android-support-library

我想创建一个登录页面,但我遇到了问题。我希望即使软键盘可见,登录按钮也始终可见。请参阅附图。 enter image description here

这是一个普通的登录页面。我使用CoordinatorLayoutAppBarLayout和扩展高度Toolbar

enter image description here

正如您在屏幕截图中看到的那样,该页面是可滚动的。我有NestedScrollView,我使用app:layout_behavior="@string/appbar_scrolling_view_behavior"

enter image description here

问题是如果打开软键盘,则会隐藏登录按钮。我希望登录按钮位于键盘的顶部。我使用了isScrollContainerwindowSoftInputMode设置但我无法设置所需的行为。

如果有帮助,这是我的xml内容。

<?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.support.design.widget.CoordinatorLayout 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:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appBarLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="196dp"
            android:background="?attr/colorPrimary"
            android:gravity="bottom"
            android:minHeight="?attr/actionBarSize"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

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

            <EditText
                android:id="@+id/username"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Username"
                android:inputType="textEmailAddress"
                android:minHeight="48dp" />

        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>

</android.support.design.widget.CoordinatorLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="bottom|end">

    <Button
        android:id="@+id/btnSignIn"
        style="?android:attr/borderlessButtonStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Sign In"
        android:textColor="?attr/colorPrimary" />

</LinearLayout>
</RelativeLayout>

在AndroidManifest.xml中:

 <activity android:name=".activities.authentication.SignInActivity"
        android:theme="@style/RegistrationTheme"
        android:windowSoftInputMode="adjustResize"
        android:label="Sign In" />

你能帮我解决这个问题吗?

我的设备是 HTC Sensation ,其中包含 Android 5.0.2(CyanogenMod 12)

2 个答案:

答案 0 :(得分:1)

在AndroidManifest.xml中找到您的活动并为keyboardInputMode添加属性: 它看起来像是

<activity
    android:name=".LoginActivity"
    android:windowSoftInputMode="adjustResize" />

必须帮助你

UPD:测试结果 enter image description here

enter image description here

答案 1 :(得分:0)

最后,我找到了解决问题的正确方法。

  1. 而不是android:windowSoftInputMode="adjustResize"我使用的android:isScrollContainer="true"代表基本相同的CoordinatorLayout
  2. CoordinatorLayoutFrameLayout,我们可以使用android:layout_gravity属性更轻松地对齐事物。
  3. 当软键盘可见时,最后也是最棘手的部分是解决滚动问题。为此,我必须覆盖AppBarLayout&#39; s Behavior。默认Behavior检查滚动视图是否足够大以滚动。但是如果打开键盘那就错了。所以我修改它以返回始终为真。通过这种方式,即使键盘可见,滚动也能正常工作。
  4. 我的自定义Behavior

    public class MyBehavior extends AppBarLayout.Behavior {
    
        public MyBehavior(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        public boolean onStartNestedScroll(CoordinatorLayout parent, AppBarLayout child, View directTargetChild, View target, int nestedScrollAxes) {
            super.onStartNestedScroll(parent, child, directTargetChild, target, nestedScrollAxes);
            return true;
        }
    }
    

    在布局xml中,您可以为layout_behavior

    设置自定义AppBarLayout
    app:layout_behavior="com.your.package.MyBehavior"
    

    布局xml的全部内容

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout 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:fitsSystemWindows="true"
    android:isScrollContainer="true">
    
    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingBottom="56dp">
    
            <EditText
                android:id="@+id/username"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:hint="Username"
                android:inputType="textEmailAddress"
                android:minHeight="48dp" />
    
        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>
    
    <android.support.design.widget.AppBarLayout
        android:id="@+id/appBarLayout"
        android:layout_width="match_parent"
        android:layout_height="168dp"
        android:background="?attr/colorPrimary"
        android:theme="@style/AppTheme.AppBarOverlay"
        app:layout_behavior="com.your.package.MyBehavior">
    
        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:collapsedTitleTextAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
            app:expandedTitleMarginStart="16dp"
            app:expandedTitleTextAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/AppTheme.PopupOverlay" />
    
        </android.support.design.widget.CollapsingToolbarLayout>
    
    </android.support.design.widget.AppBarLayout>
    
    <Button
        android:id="@+id/btnSignIn"
        style="?android:attr/borderlessButtonStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:text="Sign In"
        android:textColor="?attr/colorPrimary" />
    
    </android.support.design.widget.CoordinatorLayout>
    

    通过这种方式,一切都按预期工作。您有一个可滚动的页面,其中登录按钮(或页脚)始终可见。