解决方案是在 Manifest 中将
android:softInputMode
属性设置为 adjustResize
并将布局(不是列表项布局)放入 ScrollView 中。
从我作为 Android 开发者的早期开始,我就一直在努力使用虚拟键盘。我很惊讶 Android 仍然没有为此提供一个优雅而清晰的解决方案。
所以这里有一个解决方法,可以让你摆脱这个混乱。它可以在没有 ScrollView 解决方法或放弃全屏标志的情况下工作。
编译'net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:1.0.1'
android:windowSoftInputMode =“调整调整大小”
用垂直的 LinearLayout 包裹你的 EditText 并添加一个可见性消失的视图:
<com.ylimitapp.ylimitadmin.views.NormalFontEditText
android:id="@+id/input_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
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_width="match_parent"
android:layout_height="20dp"
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()));
}
}
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); } } }); }
这是结果:
this .getWindow().setSoftInputMode(WindowManager.LayoutParams. SOFT_INPUT_STATE_ALWAYS_HIDDEN );
在清单中为 Activity 元素设置
android:softInputMode
属性。
请参阅 Manifest 文档,了解有效值及其效果的完整列表。您特别感兴趣的可能是
adjustPan
和 adjustResize
。
将其添加到清单中,如下所示:
<activity
android:name="your_activity_name"
android:windowSoftInputMode="adjustResize"
android:theme="@style/Theme.AppCompat.DayNight.NoActionBar" />
然后在布局中添加
paddingBottom="20dp"
并编辑文本。
Дуже важливо!!! В мене клавіатура зовсім не зміщувала жодного елементу вікна。 Коли з'являлась то приховувала все собою。 Я не міг знайти рішення цілий день。 getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); Це робить вікно без верхнього та нижнього барів,але це в той же час і не давало клавіатурі посунути вікно。 Гадаю це буде корисно тим хто шукав метод, щоб клавіатура не двигала елементи на екрані коли з'являється.