Android 线性布局重量和软键盘问题

标签 android android-layout android-linearlayout android-softkeyboard

我正在尝试在聊天应用程序中实现以下 View 。基本上有两种状态,一种显示软触摸键盘,另一种不显示。

所以这是我没有显示键盘的初始状态。

enter image description here

这是键盘出现时发生的情况。

enter image description here

这就是我要实现的目标。

enter image description here

注意 我目前使用“adjust-resize”作为 windowSoftInputMode。我知道使用“adjust-pan”可以解决这个问题,但是“adjust-pan”有两个问题:

  1. 工具栏也会向上移动,为编辑文本和键盘腾出空间。
  2. editText 部分被键盘覆盖。

这里需要布局专家的帮助! 提前致谢。

编辑:

这是我的 XML 的样子:

<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">

    <LinearLayout
        android:id="@+id/view_group_toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/colorPrimaryDark"
            android:elevation="4dip" >

            <!-- Toolbar stuff -->

        </android.support.v7.widget.Toolbar>

    </LinearLayout>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/bottom_bar"
        android:layout_below="@+id/view_group_toolbar"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="0.6">

            <include
                layout="@layout/layout_that_covers_60%_of_the_screen (This is not my actual layout name :/ using it for understandability)"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/view_group_recycler_view"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="0.4"
            android:gravity="center_vertical">

            <include
                layout="@layout/layout_that_covers_40%_of_the_screen"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </LinearLayout>

    </LinearLayout>

    <RelativeLayout
        android:id="@+id/bottom_bar"
        android:layout_width="match_parent"
        android:layout_height="60dip"
        android:layout_alignParentBottom="true"
        android:gravity="bottom"
        android:padding="8dip" > 
            <!-- This is where my edit text resides -->

    </RelativeLayout> 

</RelativeLayout>

最佳答案

所以这是我认为你应该做的, 使用

windowSoftInputMode="adjustResize"- Activity 的主窗口总是调整大小以便为屏幕上的软键盘腾出空间。 adjustResize 也会使 ToolBar 保持在顶部。

尝试将两个 LinearLayouts 添加到 NestedScrollView 中。我这样说的原因是因为您的 NestedScrollView 内容可以向上滚动。

我认为您的布局将如下所示-。

<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">

<LinearLayout
    android:id="@+id/view_group_toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimaryDark"
        android:elevation="4dip" >

        <!-- Toolbar stuff -->

    </android.support.v7.widget.Toolbar>

</LinearLayout>


<NestedScrollView 
    android:layout_above="@+id/bottom_bar"
    android:layout_below="@+id/view_group_toolbar">
  <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.6">

        <include
            layout="@layout/layout_that_covers_60%_of_the_screen (This is not my actual layout name :/ using it for understandability)"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/view_group_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.4"
        android:gravity="center_vertical">

        <include
            layout="@layout/layout_that_covers_40%_of_the_screen"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

  </LinearLayout>
</NestedScrollView>
<RelativeLayout
    android:id="@+id/bottom_bar"
    android:layout_width="match_parent"
    android:layout_height="60dip"
    android:layout_alignParentBottom="true"
    android:gravity="bottom"
    android:padding="8dip" > 
        <!-- This is where my edit text resides -->

</RelativeLayout> 

让我知道这是否适合您。

编辑 1: 如果您的布局中有 RecyclerView,您可能需要设置此属性以实现平滑滚动 -

recyclerView.setNestedScrollingEnabled(false);

关于Android 线性布局重量和软键盘问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41906712/

相关文章:

android - 覆盖触控板点击

android - 根据手机屏幕尺寸设置 ImageView 的尺寸

android - 将参数传递给 fragment

ListView 中的 Android 文本被截断

android - 无法在android中居中布局

java - 正则表达式匹配 Java 中的特定 HTTP header 值

android - 如何在 Ktor 中设置类似于 Retrofit 的`Retrofit.Builder().baseUrl(baseUrl) 的 basePath?

android - Firebase 处理断开与数据库的连接

android - 如何在 ConstraintLayout 中使 TextView 之间的间距均匀?

android - 如何限制 GridLayout 中 ListView 的高度?