软键盘隐藏了一半的 EditText
Posted
技术标签:
【中文标题】软键盘隐藏了一半的 EditText【英文标题】:Soft keyboard hides half of EditText 【发布时间】:2013-12-06 08:23:12 【问题描述】:我有一个ListView
,最后一个列表项包含EditText
:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical" >
<RelativeLayout
android:id="@+id/contentLayout"
android:layout_
android:layout_
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="30dp"
android:orientation="vertical" >
<ImageView
android:id="@+id/test"
android:layout_
android:layout_
android:layout_alignRight="@+id/messageEditText"
android:layout_below="@+id/messageEditText"
android:layout_marginRight="14dp"
android:src="@drawable/test" />
<EditText
android:id="@+id/messageEditText"
android:layout_
android:layout_
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/sendImageButton"
android:ems="10"
android:gravity="top"
android:hint="@string/messageEditText"
android:inputType="textMultiLine"
android:minHeight="55dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="10dp" />
<ImageButton
android:id="@+id/sendImageButton"
android:layout_
android:layout_
android:layout_alignBottom="@id/messageEditText"
android:layout_alignParentRight="true"
android:layout_alignTop="@id/messageEditText"
android:adjustViewBounds="true"
android:maxHeight="55dp"
android:maxWidth="55dp"
android:padding="12dp"
android:scaleType="centerInside"
android:src="@drawable/sendmessage" />
</RelativeLayout>
</RelativeLayout>
EditText
的一半是隐藏的。我也无法滚动ListView
。有什么解决办法吗?
【问题讨论】:
Android soft keyboard covers edittext field的可能重复 我在设置 android:windowSoftInputMode="adjustResize|stateHidden" 并使用滚动视图后遇到了同样的问题。还有其他建议吗? [属性 android:windowSoftInputMode="adjustResize" 不适用于全屏活动,您必须删除活动全屏标志才能获得调整大小的优势。 ](***.com/a/42204350/3926264) 【参考方案1】:解决方案是在 Manifest 中将 android:softInputMode
属性设置为 adjustResize
,并将布局(不是列表项布局)放入 ScrollView。
【讨论】:
【参考方案2】:我有一个类似的问题,然后我使用了android:windowSoftInputMode="adjustResize|stateHidden"
,正如提到的here..它对我来说效果很好..
【讨论】:
嗨@IgorGanapolsky .. stateHidden 设置将在用户进入新活动时隐藏软键盘(即使 EditText 控件获得焦点)。只有当用户单击编辑框控件时才会显示软键盘。【参考方案3】:从我作为 Android 开发人员的早期开始,我就一直在使用虚拟键盘。我很惊讶 Android 仍然没有为此提供优雅而清晰的解决方案。
所以这里有一个解决方法,可以让你摆脱这个混乱。它可以在没有 ScrollView 解决方法或放弃全屏标志的情况下工作。
-
将这个很棒的库添加到您的 gradle 文件中:
编译'net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:1.0.1'
-
确保您的活动具有以下键盘设置:
android:windowSoftInputMode="adjustResize"
用垂直 LinearLayout 包裹你的 EditText 并添加一个可见性为 Gone 的视图:
<com.ylimitapp.ylimitadmin.views.NormalFontEditText
android:id="@+id/input_et"
android:layout_
android:layout_
android:inputType="textCapSentences|textMultiLine"
android:imeOptions="actionSend"
android:paddingStart="20dp"
android:paddingEnd="40dp"
android:paddingTop="10dp"
android:maxHeight="120dp"
android:adjustViewBounds= "true"
android:scrollHorizontally="false"
android:textColorHint="#7b7b7b"
android:hint="@string/type_your_message"
android:background="@drawable/msg_inputfield_bg"
android:textColor="@color/black_text_color"
android:textSize="15.33sp"
/>
<View
android:id="@+id/keyboard_view"
android:layout_
android:layout_
android:visibility="gone"
/>
</LinearLayout>
计算屏幕大小,以便计算推送 EditText 的视图高度:
private void storeScreenHeightForKeyboardHeightCalculations()
Rect r = new Rect();
View rootview = getActivity().getWindow().getDecorView();
rootview.getWindowVisibleDisplayFrame(r);
mOriginalScreenHeight = r.height();
Rect rectangle = new Rect();
Window window = getActivity().getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
int statusBarHeight = rectangle.top;
int contentViewTop =
window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int titleBarHeight= contentViewTop - statusBarHeight;
if (titleBarHeight == 0)
mOriginalScreenHeight -= (24 * Utils.getDensity(getContext()));
-
为键盘打开和关闭事件添加监听器,然后在运行时设置 EditText 下方的 View 高度,以便我们在任何设备和自定义键盘上正确设置高度。然后只需在键盘打开时使其可见:
private void addkeyBoardlistener() KeyboardVisibilityEvent.setEventListener( getActivity(), new KeyboardVisibilityEventListener() @Override public void onVisibilityChanged(boolean isOpen) if (isOpen) Rect r = new Rect(); View rootview = getActivity().getWindow().getDecorView(); // this = activity rootview.getWindowVisibleDisplayFrame(r); int keyboardHeight = (mOriginalScreenHeight - r.height()); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) keyboard_view.getLayoutParams(); params.height = (int) ((keyboardHeight + 5 * Utils.getDensity(getContext()))); keyboard_view.setLayoutParams(params); keyboard_view.setVisibility(View.VISIBLE); else keyboard_view.setVisibility(View.GONE); );
这是结果:
【讨论】:
【参考方案4】:在窗口启动时禁用键盘
this .getWindow().setSoftInputMode(WindowManager.LayoutParams. SOFT_INPUT_STATE_ALWAYS_HIDDEN );
【讨论】:
【参考方案5】:在 Manifest 中为 Activity 元素设置 android:softInputMode
属性。
请参阅Manifest documentation 以获取有效值及其效果的完整列表。您特别感兴趣的可能是adjustPan
和adjustResize
。
【讨论】:
@Tanis.7x 你不能同时使用adjustPan
和adjustResize
。
我从来没有说过要同时使用两者——我提到了两者,因为根据所需的最终行为,任何一个都可能适用。您应该查看两者的文档并选择提供所需行为的文档。【参考方案6】:
像这样在清单中添加这个:
<activity
android:name="your_activity_name"
android:windowSoftInputMode="adjustResize"
android:theme="@style/Theme.AppCompat.DayNight.NoActionBar" />
然后在你的布局和editText中添加paddingBottom="20dp"
。
【讨论】:
以上是关于软键盘隐藏了一半的 EditText的主要内容,如果未能解决你的问题,请参考以下文章
Android - 隐藏EditText弹出的软键盘输入(SoftInput)