В настоящее время я разрабатываю простую программу Notes, в которой пользователь может ввести заголовок и содержание своей заметки. То, что я хочу достичь, - это то, что когда пользователь нажимает на содержимое заметки (EditText), появляется мягкая клавиатура, и только содержимое заметки EditText уменьшается в размере (изменяется), а все остальное остается в том же положении.EditText AdjustResize форсирование содержимого вне поля зрения
Моя текущая реализация можно увидеть ниже:
Manifest:
<activity android:theme="@style/AppTheme"
android:name=".AddActivity"
android:label="@string/add_record"
android:windowSoftInputMode="adjustResize"
android:parentActivityName=".MainActivity"
android:excludeFromRecents="true"/>
XML - Добавить активность
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/add_record"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp">
<EditText
android:id="@+id/title_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/enter_title"
android:inputType="textCapSentences"
android:textColor="@color/fontPrimary"
android:theme="@style/EditTextCustomCursor">
<requestFocus />
</EditText>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/modify_scrollview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fitsSystemWindows="false"
android:isScrollContainer="false"
android:fillViewport="true">
<EditText
android:id="@+id/note_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:ellipsize="end"
android:gravity="top|left"
android:hint="@string/enter_note"
android:inputType="textCapSentences|textMultiLine"
android:paddingLeft="5dp"
android:scrollHorizontally="false"
android:textColor="@color/fontPrimary"
android:theme="@style/EditTextCustomCursor" />
</ScrollView>
</LinearLayout>
Java - Добавить активность
private int screenHeight;
private int actionBarHeight = 350;
private int keyboardHeight;
...
private void setupListeners() {
final LinearLayout layout = (LinearLayout) findViewById(R.id.add_record);
layout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
layout.getWindowVisibleDisplayFrame(r);
screenHeight = layout.getRootView().getHeight();
keyboardHeight = screenHeight - (r.bottom - r.top);
Log.d("Keyboard Size", "Size: " + keyboardHeight);
}
});
KeyboardVisibilityEvent.setEventListener(
AddActivity.this,
new KeyboardVisibilityEventListener() {
@Override
public void onVisibilityChanged(boolean isOpen) {
if (isOpen) {
Log.d("KB", "openKeyboard");
scrollView.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT, screenHeight - actionBarHeight - keyboardHeight));
} else {
Log.d("KB", "closeKeyboard");
scrollView.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
}
}
});
}
Это использование библиотеки клавиатуры (https://github.com/yshrsmz/KeyboardVisibilityEvent) для обнаружения, когда клавиатура открыта или закрыта. Это работает отлично, и высота/макет настраивается так, как я хочу, чтобы он выглядел, но только если пользователь нажимает на верхнюю часть EditText. Если пользователь нажимает на нижнюю часть EditText (если они ввели длинную заметку), то весь макет подталкивается вверх, оставляя большой пробел в нижней части страницы.
Таким образом, есть ли способ, как везде в EditText/ScrollView пользователь нажимает, так как он только настраивает один EditText по высоте и оставляет другой EditText на месте в верхней части экрана, не нажимая его и SupportActionBar вне поля зрения? Кроме того, ScrollView используется для создания вертикальной полосы прокрутки в правой части экрана - если такое же поведение может быть достигнуто с помощью только EditText, тогда я бы полностью удалил ScrollView.
EDIT - Добавить фото
Изображение 1: Длинное содержание примечания (в нижней части содержания ноты находятся в нижней части Scrollview (который нельзя увидеть, пока не прокручиваются))
Изображение 2: одно и то же примечание, но щелкнув внизу, заставляет верхний EditText и Support ActionBar отсутствовать, оставив пробел внизу.
Пояснение: Где подсвечивается F (в Image 2), что в нижней части EditText/ScrollView, так что вы можете увидеть большой разрыв, созданный между верхней мягкой клавиатуры и нижней части EditText/ScrollView
Желаемое поведение: нажатие в любом месте в нижней части EditText должно только изменять размер этого конкретного EditText, чтобы освободить место для мягкой клавиатуры и убедиться, что этот EditText находится над мягкой клавиатурой, чтобы пользователь мог видеть, что они печатают, top EditText остается в одном месте.
Вы можете добавить скриншот к себе, как его вести себя сейчас и как вы хотите! – shadygoneinsane
какая версия для Android? –
@PratikPopat в настоящее время тестирует на Lollipop & Marshmallow; оба имеют одинаковое поведение. –