gpt4 book ai didi

Android 自定义软键盘 - 更改 KEYCODE_ENTER 行为以跳过非 EditText 对象,如默认软键盘行为

转载 作者:搜寻专家 更新时间:2023-11-01 08:40:29 25 4
gpt4 key购买 nike

按照这个示例 https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/,我有自己的软键盘。我想修改 KEYCODE_ENTER 行为。

示例:我的 Activity A 及其布局 layout_A: EditText edt_1 + CheckBox chb_1 + EditText edt_2

Android 默认软键盘的行为:

focus edt_1 > KEYCODE_ENTER > skip chb_1 > focus edt_2 >> what I want

我的软键盘:

focus edt_1 > KEYCODE_ENTER > focus chb_1 >> FAIL

谁有Android默认软键盘的源码? (带有数字文本键盘和全文本键盘的布局)

任何建议都可能有所帮助,非常感谢。

public class SoftKeyboard extends InputMethodService implements KeyboardView.OnKeyboardActionListener

@Override public void onStartInput(EditorInfo attribute, boolean restarting) {
super.onStartInput(attribute, restarting);

// Reset our state. We want to do this even if restarting, because
// the underlying state of the text editor could have changed in any way.
mComposing.setLength(0);
updateCandidates();

if (!restarting) {
// Clear shift states.
mMetaState = 0;
}

boolean isEditText = true;

mPredictionOn = false;
mCompletionOn = false;
mCompletions = null;

//TODO: setup own behavior
// We are now going to initialize our state based on the type of
// text being edited.
switch (attribute.inputType & InputType.TYPE_MASK_CLASS) {
case InputType.TYPE_CLASS_NUMBER:
mCurKeyboard = mNumberKeyboard;
break;

case InputType.TYPE_CLASS_DATETIME:
// Numbers and dates default to the symbols keyboard, with
// no extra features.
mCurKeyboard = mSymbolsKeyboard;
break;

case InputType.TYPE_CLASS_PHONE:
// Phones will also default to the symbols keyboard, though
// often you will want to have a dedicated phone keyboard.
mCurKeyboard = mSymbolsKeyboard;
break;

case InputType.TYPE_CLASS_TEXT:
// This is general text editing. We will default to the
// normal alphabetic keyboard, and assume that we should
// be doing predictive text (showing candidates as the
// user types).
mCurKeyboard = mQwertyKeyboard;
mPredictionOn = true;

// We now look for a few special variations of text that will
// modify our behavior.
int variation = attribute.inputType & InputType.TYPE_MASK_VARIATION;
if (variation == InputType.TYPE_TEXT_VARIATION_PASSWORD ||
variation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
// Do not display predictions / what the user is typing
// when they are entering a password.
mPredictionOn = false;
}

if (variation == InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
|| variation == InputType.TYPE_TEXT_VARIATION_URI
|| variation == InputType.TYPE_TEXT_VARIATION_FILTER) {
// Our predictions are not useful for e-mail addresses
// or URIs.
mPredictionOn = false;
}

if ((attribute.inputType & InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE) != 0) {
// If this is an auto-complete text view, then our predictions
// will not be shown and instead we will allow the editor
// to supply their own. We only show the editor's
// candidates when in fullscreen mode, otherwise relying
// own it displaying its own UI.
mPredictionOn = false;
mCompletionOn = isFullscreenMode();
}

// We also want to look at the current state of the editor
// to decide whether our alphabetic keyboard should start out
// shifted.
updateShiftKeyState(attribute);
break;

default:
// For all unknown input types, default to the alphabetic
// keyboard with no special features.
mCurKeyboard = mNonEditTextKeyboard;
updateShiftKeyState(attribute);
isEditText = false;
}

// Update the label on the enter key, depending on what the application
// says it will do.
mCurKeyboard.setImeOptions(getResources(), attribute.imeOptions);

if ((mInputView!= null) && (!isEditText)) {
//TODO: handle non edit text case.
handleClose();
}
}

最佳答案

要修改软键盘上的输入行为,您必须创建自定义 EditText 类并覆盖 onCreateInputConnections。请参阅下面的示例,其中当用户使用此特定 EditText 时,我始终显示“完成”而不是下一步。

@Override
public InputConnection onCreateInputConnection(@NonNull EditorInfo outAttrs) {
InputConnection connection = super.onCreateInputConnection(outAttrs);
int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION;
if ((imeActions&EditorInfo.IME_ACTION_DONE) != 0) {
// clear the existing action
outAttrs.imeOptions ^= imeActions;
// set the DONE action
outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE;
}
if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
}
return connection;
}

您还可以设置接下来在您的布局中哪些 EditText 应该获得焦点

android:nextFocusDown=""

传入下一个要聚焦的 EditText 的 id。

关于Android 自定义软键盘 - 更改 KEYCODE_ENTER 行为以跳过非 EditText 对象,如默认软键盘行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33106795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com