You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-07 12:30:27 +00:00
Merge pull request #40469 from nekomatata/virtual-keyboard-enter-fixes-3.2
[3.2] Fix Return key events in LineEdit & TextEdit on Android
This commit is contained in:
@@ -493,9 +493,9 @@ public class GodotIO {
|
||||
return (int)(metrics.density * 160f);
|
||||
}
|
||||
|
||||
public void showKeyboard(String p_existing_text, int p_max_input_length, int p_cursor_start, int p_cursor_end) {
|
||||
public void showKeyboard(String p_existing_text, boolean p_multiline, int p_max_input_length, int p_cursor_start, int p_cursor_end) {
|
||||
if (edit != null)
|
||||
edit.showKeyboard(p_existing_text, p_max_input_length, p_cursor_start, p_cursor_end);
|
||||
edit.showKeyboard(p_existing_text, p_multiline, p_max_input_length, p_cursor_start, p_cursor_end);
|
||||
|
||||
//InputMethodManager inputMgr = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
//inputMgr.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
|
||||
|
||||
@@ -36,6 +36,7 @@ import android.content.Context;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.text.InputFilter;
|
||||
import android.text.InputType;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
@@ -58,7 +59,8 @@ public class GodotEditText extends EditText {
|
||||
private GodotTextInputWrapper mInputWrapper;
|
||||
private EditHandler sHandler = new EditHandler(this);
|
||||
private String mOriginText;
|
||||
private int mMaxInputLength;
|
||||
private int mMaxInputLength = Integer.MAX_VALUE;
|
||||
private boolean mMultiline = false;
|
||||
|
||||
private static class EditHandler extends Handler {
|
||||
private final WeakReference<GodotEditText> mEdit;
|
||||
@@ -95,7 +97,11 @@ public class GodotEditText extends EditText {
|
||||
|
||||
protected void initView() {
|
||||
this.setPadding(0, 0, 0, 0);
|
||||
this.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
|
||||
this.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_ACTION_DONE);
|
||||
}
|
||||
|
||||
public boolean isMultiline() {
|
||||
return mMultiline;
|
||||
}
|
||||
|
||||
private void handleMessage(final Message msg) {
|
||||
@@ -115,6 +121,12 @@ public class GodotEditText extends EditText {
|
||||
edit.mInputWrapper.setSelection(false);
|
||||
}
|
||||
|
||||
int inputType = InputType.TYPE_CLASS_TEXT;
|
||||
if (edit.isMultiline()) {
|
||||
inputType |= InputType.TYPE_TEXT_FLAG_MULTI_LINE;
|
||||
}
|
||||
edit.setInputType(inputType);
|
||||
|
||||
edit.mInputWrapper.setOriginText(text);
|
||||
edit.addTextChangedListener(edit.mInputWrapper);
|
||||
final InputMethodManager imm = (InputMethodManager)mView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
@@ -168,7 +180,7 @@ public class GodotEditText extends EditText {
|
||||
// ===========================================================
|
||||
// Methods
|
||||
// ===========================================================
|
||||
public void showKeyboard(String p_existing_text, int p_max_input_length, int p_cursor_start, int p_cursor_end) {
|
||||
public void showKeyboard(String p_existing_text, boolean p_multiline, int p_max_input_length, int p_cursor_start, int p_cursor_end) {
|
||||
int maxInputLength = (p_max_input_length <= 0) ? Integer.MAX_VALUE : p_max_input_length;
|
||||
if (p_cursor_start == -1) { // cursor position not given
|
||||
this.mOriginText = p_existing_text;
|
||||
@@ -181,6 +193,8 @@ public class GodotEditText extends EditText {
|
||||
this.mMaxInputLength = maxInputLength - (p_existing_text.length() - p_cursor_end);
|
||||
}
|
||||
|
||||
this.mMultiline = p_multiline;
|
||||
|
||||
final Message msg = new Message();
|
||||
msg.what = HANDLER_OPEN_IME_KEYBOARD;
|
||||
msg.obj = this;
|
||||
|
||||
@@ -123,7 +123,7 @@ public class GodotTextInputWrapper implements TextWatcher, OnEditorActionListene
|
||||
public void run() {
|
||||
for (int i = 0; i < count; ++i) {
|
||||
int key = newChars[i];
|
||||
if (key == '\n') {
|
||||
if ((key == '\n') && !mEdit.isMultiline()) {
|
||||
// Return keys are handled through action events
|
||||
continue;
|
||||
}
|
||||
@@ -151,7 +151,7 @@ public class GodotTextInputWrapper implements TextWatcher, OnEditorActionListene
|
||||
});
|
||||
}
|
||||
|
||||
if (pActionID == EditorInfo.IME_NULL) {
|
||||
if (pActionID == EditorInfo.IME_ACTION_DONE) {
|
||||
// Enter key has been pressed
|
||||
GodotLib.key(KeyEvent.KEYCODE_ENTER, 0, true);
|
||||
GodotLib.key(KeyEvent.KEYCODE_ENTER, 0, false);
|
||||
|
||||
Reference in New Issue
Block a user