我正在创建一个基于聊天的用户界面屏幕,其中我有聊天消息的工具栏和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>
答案 0 :(得分:17)
问题是我在<item name="android:windowTranslucentStatus">true</item>
styles.xml
在您的活动的父级布局中启用adjustResize
添加android:fitsSystemWindows="true"
答案 1 :(得分:12)
或者在清单中添加此行。 android:windowSoftInputMode="adjustResize"
答案 2 :(得分:9)
如果您不希望推升Toolbar
,则不应使用adjustPan
。 1}}没有任何其他事情(不添加任何额外的adjustResize
)就足够了。
答案 3 :(得分:5)
在我的情况下,我的默认应用程序使用了根元素的协调器布局。即使做上面描述的事情也没有解决我的问题。 然后我做了以下事情:
android:fitsSystemWindows="true"
到根布局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)
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)
android:fitsSystemWindows="true"
。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
。
发生的事情是,例如,您具有带有搜索视图的列表视图,当您使用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 answer将windowFullscreen
中的styles.xml
设置为false才能使其正常工作
<item name="android:windowFullscreen">false</item>