Android的runonuthread隐藏了软键盘



在我的android应用程序中,核心逻辑是用c++编写的。因此,对于多个场景,将会发生JNI调用。

在一个用例中,当用户在'EditText'中输入文本时,我调用一个JNI方法,该方法将大写每个单词(逻辑和结果可能因情况而异)。

TextChange处理程序调用一个JNI函数,该函数将在工作线程中大写文本中的每个单词,然后在主线程上调用一个使用'runOnUIThread'的方法来更新文本字段的值。我的期望是这应该无缝地发生,不应该妨碍用户交互的方式。

代码示例:

调用JNI函数-

edittext.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

OnTextChanged (edittext.getId(), String.valueOf(s));
}
...
});

用大写文本更新EditText -

// Below function is invoked on the Main Thread once the Worker Thread is done with its job of capitalizing
// An entry function is called which gets the textfield object from the layout and then called the below
public static void UpdateTextField(EditText pEditTextObj, int pID, int pPosX, int pPosY, int pHeight, int pWidth, int pColor, String pText)
{
Log.d("SampleJNIApp01", "TextField valued to be updated = " + pText);

pEditTextObj.setText(pText);
pEditTextObj.requestFocus();
pEditTextObj.setCursorVisible(true);
pEditTextObj.setSelection(pEditTextObj.getText().length());
// TODO - Show the keyboard 
}

观察:

一旦输入第一个字母,JNI函数就会将其大写,并且EditText中的文本也会更新。然而,焦点消失了,光标不可见,键盘被隐藏。

当我在文本字段中输入时,观察到同样的情况,一些工作线程调用了一些java方法来'runOnUIthread' -焦点丢失,软键盘被隐藏。

我做错了什么吗?

不知道为什么runOnUIthread要把键盘隐藏起来。

但是你可以尝试使用Handler来发布更新到UI。

Handler(Looper.getMainLooper()).post {
//Update UI.
}

我认为有两个选项,您可以使用它来防止键盘在UI线程上发布时被隐藏:

首先可以添加以下代码(adjustPan))在你的manifest XML文件中的holder活动(如果你在Fragment,将它添加到调用Fragment的活动中):

<activity android:windowSoftInputMode="adjustPan"> </activity>

,adjustPan">

活动的主窗口没有调整大小以腾出空间给软键盘。相反,窗口的内容是自动平移的因此,当前的焦点永远不会被键盘和用户所掩盖总能看到他们在打什么。这通常是不太理想的而不是调整大小,因为用户可能需要关闭软键盘来获取窗口的模糊部分并与之交互

第二个选项是在你发布到UI线程后使用一个显式的软键盘调用:

InputMethodManager imm = (InputMethodManager)   getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

最新更新