当键盘出现时,Android工具栏会向上移动

时间:2015-09-18 10:26:24

标签: android android-linearlayout android-toolbar android-recyclerview appcompat-v7-r22.2

我正在创建一个基于聊天的用户界面屏幕,其中我有聊天消息的工具栏和recyclelerview,并回复消息布局。

每当edittext获得焦点时,它会向上移动工具栏。相反,我想调整Recyclerview的大小。

某些 stackoverflow答案建议在工具栏下放置空滚动视图,但它不起作用。

        <activity
            android:name=".PostMessageActivity"
            android:label="@string/title_activity_post_message"
            android:windowSoftInputMode="stateVisible|adjustResize"
            >
        </activity>

我在清单文件中将windowSoftInputMode设置为stateVisible|adjustPan

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.pasonet.yokibu.PostMessageActivity"
>
<include
    android:id="@+id/toolbar_home"
    layout="@layout/toolbar_home"
    android:elevation="5dp"
    />

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</ScrollView>


<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/toolbar_home"
    android:orientation="vertical"
    android:layout_above="@+id/add_post_layout"
    >
    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/post_msg_recyclerview"
        >
    </android.support.v7.widget.RecyclerView>


</LinearLayout>

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:padding="5dp"
    android:id="@+id/add_post_layout"
    android:background="#ffffff"
    android:layout_alignParentLeft="true"
    android:layout_alignParentRight="true"
    android:elevation="5dp"
    android:layout_margin="0pt"
   >

    <EditText
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:id="@+id/messageText"
        android:layout_gravity="bottom"
        android:layout_weight="1"
        android:maxLines="4"
        android:scrollbars="vertical"
        android:background="@color/trasnperant"
        android:hint="Type your message"
        android:layout_marginBottom="4dp"
        />
    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_send_black_36dp"
        android:id="@+id/sendButton"
        android:background="@drawable/abc_btn_default_mtrl_shape"
        android:onClick="addPost"
        />
</LinearLayout>

enter image description here

15 个答案:

答案 0 :(得分:17)

问题是我在<item name="android:windowTranslucentStatus">true</item>

中使用styles.xml

在您的活动的父级布局中启用adjustResize添加android:fitsSystemWindows="true"

答案 1 :(得分:12)

或者在清单中添加此行。 android:windowSoftInputMode="adjustResize"

答案 2 :(得分:9)

如果您不希望推升Toolbar,则不应使用adjustPanadjustResize)就足够了。

答案 3 :(得分:5)

在我的情况下,我的默认应用程序使用了根元素的协调器布局。即使做上面描述的事情也没有解决我的问题。 然后我做了以下事情:

  1. 将根布局从“协调器布局”更改为“RelativeLayout”
  2. 包含android:fitsSystemWindows="true"到根布局
  3. android:windowSoftInputMode="adjustResize|stateAlwaysHidden"包含在活动清单标记中。

答案 4 :(得分:4)

你应该添加android:fitsSystemWindows =&#34; true&#34;在工具栏的根布局中。如果您将其添加到活动的父级布局中,工具栏上方会显示一条奇怪的行(状态栏高度)。

答案 5 :(得分:2)

<include
    android:id="@+id/toolbar_home"
    layout="@layout/toolbar_home"
    android:elevation="5dp"
android:layout_alignParentTop="true"
    />

答案 6 :(得分:2)

enter image description here

Here is the solution for this fix
- android:windowSoftInputMode="adjustResize" in Manifest File
- Make a class "CommentKeyBoardFix.Java" and copy and paste the below code.

public class CommentKeyBoardFix
{
private View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;
private Rect contentAreaOfWindowBounds = new Rect();

public CommentKeyBoardFix(Activity activity)
{
    FrameLayout content = activity.findViewById(android.R.id.content);
    mChildOfContent = content.getChildAt(0);
    mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(this::possiblyResizeChildOfContent);
    frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
}

private void possiblyResizeChildOfContent()
{
    int usableHeightNow = computeUsableHeight();
    if (usableHeightNow != usableHeightPrevious)
    {
        int heightDifference = 0;
        if (heightDifference > (usableHeightNow /4))
        {
            // keyboard probably just became visible
            frameLayoutParams.height = usableHeightNow - heightDifference;
        }
        else
        {
            // keyboard probably just became hidden
            frameLayoutParams.height = usableHeightNow;
        }
        mChildOfContent.layout(contentAreaOfWindowBounds.left, contentAreaOfWindowBounds.top, contentAreaOfWindowBounds.right, contentAreaOfWindowBounds.bottom);
        mChildOfContent.requestLayout();
        usableHeightPrevious = usableHeightNow;
    }
}

private int computeUsableHeight()
{
    mChildOfContent.getWindowVisibleDisplayFrame(contentAreaOfWindowBounds);
    return contentAreaOfWindowBounds.height();
}
}

And then call this class in your Activity or Fragment
setContentView(R.layout.your_comments_layout)
CommentKeyBoardFix(this) ---> For Kotlin
or
new CommentKeyBoardFix(this) ---> For Java

答案 7 :(得分:1)

试试这个,

android:windowSoftInputMode="adjustPan"

在活动代码的manifest.xml中。

答案 8 :(得分:1)

在清单中的活动上使用android:windowSoftInputMode="adjustNothing"为我工作。

答案 9 :(得分:1)

  1. 在活动的 xml 文件的根目录中包含 android:fitsSystemWindows="true"
  2. 在活动清单标签中包含 android:windowSoftInputMode="stateHidden|adjustResize"

这两个步骤解决了我的问题。

答案 10 :(得分:0)

请检查Android Manifest中的WindowsSoftInputMode 尝试设置AdjustResize或AdjsutPan

答案 11 :(得分:0)

我使用CoordinatorLayout作为工具栏的根布局。我有同样的问题,但通过将工具栏设置为:

来解决它
app:layout_scrollFlags="enterAlways" 

而不是:

app:layout_scrollFlags="scroll|enterAlways"

并添加:

android:windowSoftInputMode="adjustNothing"

在清单中的活动中。

答案 12 :(得分:0)

我尝试了很多方法来保持工具栏的固定,而不是通过android调整大小或压缩布局:windowSoftInputMode =“adjustResize”,这是不合适的。

这只能通过协调员布局来实现,

<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.design.widget.CollapsingToolbarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar 
           xmlns:android="http://schemas.android.com/apk/res/android"
           xmlns:ripple="http://schemas.android.com/apk/res-auto"
           android:id="@+id/tv_toolbar"
           android:layout_width="match_parent"
           android:layout_height="50dp"
           android:background="#fff"
           ripple:contentInsetStart="0dp">
        </android.support.v7.widget.Toolbar>

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

<ScrollView
    android:id="@+id/coordinate_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:marginTop="56dp">
</ScrollView>

将结构保持为

 Coordinator layout
  |-->Toolbar    (android:id="@+id/toolbar")
  |-->ScrollView (android:layout_below="@id/toolbar")
   |-->Child
   |-->Child
   |-->Child

答案 13 :(得分:0)

如果没有任何作用有效,请注意,库可以操纵软输入,例如com.arlib.floatingsearchview

enter image description here

发生的事情是,例如,您具有带有搜索视图的列表视图,当您使用floatingsearchview显示片段时,将其软输入设置为SOFT_INPUT_ADJUST_PAN(在列表视图的片段中您可能并不关心它),但是如果下一个片段是带有许多编辑文本的项目详细信息,则会将工具栏向上推。

就我而言,我无法替换此库,因此我在基本片段中设置了SOFT_INPUT_ADJUST_RESIZE

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
}

答案 14 :(得分:0)

在我的情况下,我必须结合above answerwindowFullscreen中的styles.xml设置为false才能使其正常工作

<item name="android:windowFullscreen">false</item>