Я пользуюсь этой библиотекой: https://github.com/yshrsmz/KeyboardVisibilityEvent, чтобы обнаружить, когда клавиатура открыта или закрыта, и это зависит от android:windowSoftInputMode="adjustResize"
, входящих в манифест Android.Android AdjustResize не изменяет размер правильно
Эта библиотека отлично работает, чтобы обнаруживать открытые и закрытые события мягкой клавиатуры, но мой контент выталкивается из поля зрения из-за параметра adjustResize.
Java:
KeyboardVisibilityEvent.setEventListener( AddActivity.this, new KeyboardVisibilityEventListener() { @Override public void onVisibilityChanged(boolean isOpen) { // some code depending on keyboard visiblity status if (noteEditText.isFocused()) { if (isOpen) { Log.d("KB", "Keyboard is open"); noteEditText.setLines(12); noteEditText.setCursorVisible(true); } else { Log.d("KB", "Keyboard is closed"); noteEditText.setLines(50); noteEditText.setCursorVisible(false); } } } }); noteEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { Log.d("KB", "onFocusChange"); if (firstStart) { noteEditText.setLines(12); noteEditText.setCursorVisible(true); firstStart = false; } } });
XML:
<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" android:windowSoftInputMode="stateHidden"> <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> <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:lines="50" android:maxLines="20" android:minLines="5" android:paddingLeft="5dp" android:scrollHorizontally="false" android:scrollbars="vertical" android:textColor="@color/fontPrimary" android:theme="@style/EditTextCustomCursor" />
Так это прекрасно работает, регулируя линии второго EditText так, то я набрав над клавиатурой, но когда я закрываю клавиатуру, прокрутите страницу до конца этого EditText и нажмите внизу, курсор EditText помещается туда, где я щелкнул, но затем он выталкивает первый EditText и Support ActionBar из вида и оставляет большой зазор внизу (как может быть (изображение 2) ниже, где выбрано «F», то есть нижняя часть EditText).
Я также пытался используя «adjustNothing» и выполняя следующие действия, но это, похоже, не работает, поскольку высота EditText не будет изменяться до тех пор, пока количество строк не изменится и онемение er строк изменяются только тогда, когда он знает, открыта или закрыта клавиатура.
private void setupListeners() {
final View activityRootView = getWindow().getDecorView().findViewById(android.R.id.content);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
View mainView = (LinearLayout) findViewById(R.id.add_record);
int heightDiff = mainView.getHeight() - noteEditText.getHeight();
Log.d("KB", "HeightDiff: " + heightDiff);
if (heightDiff > 1000 || keyboardShown) { // 99% of the time the height diff will be due to a keyboard.
Log.d("KB", "Keyboard is open");
if (isKeyboardVisible) {
noteEditText.setLines(12);
noteEditText.setCursorVisible(true);
noteEditText.requestLayout();
isKeyboardVisible = false;
}
} else {
Log.d("KB", "Keyboard is closed");
if (!isKeyboardVisible) {
noteEditText.setLines(50);
noteEditText.setCursorVisible(false);
noteEditText.requestLayout();
isKeyboardVisible = true;
}
}
}
});
noteEditText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
numTimesClicked++;
Log.d("KB", "onClick: " + numTimesClicked);
if (clicked) {
// Run function
Log.d("KB", "clicked");
InputMethodManager imm = (InputMethodManager) AddActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isAcceptingText()) {
Log.d("KB", "Software Keyboard was shown");
isKeyboardVisible = true;
keyboardShown = true;
} else {
Log.d("KB", "Software Keyboard was not shown");
isKeyboardVisible = false;
keyboardShown = false;
}
} else {
Log.d("KB", "scroll");
clicked = true;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
clicked = false;
}
}, 3 * 1000);
}
}
});
noteEditText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
Log.d("KB", "closeKeyboard");
noteEditText.setLines(50);
noteEditText.setCursorVisible(false);
noteEditText.requestLayout();
isKeyboardVisible = false;
}
return false;
}
});
Поэтому, как бы я идти о достижении желаемого эффекта подгонки линий EditText (при открытии клавиатуры и закрытой), а не толкая другой контент из поля зрения? Итак, поддержка ActionBar и первый EditText всегда остаются в одной и той же позиции, и только второй EditText настраивается, когда появляется мягкая клавиатура?
Благодарим за предложение с помощью ScrollView (поскольку это частично разрешило мою проблему), но по-прежнему вызывает одну последнюю проблему, если пользователь нажимает на строку без прокрутки (см. Мой ответ ниже). –