runOnUIThread for Android隐藏了软键盘

e0bqpujr  于 2023-01-07  发布在  Android
关注(0)|答案(2)|浏览(156)

在我的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"-焦点丢失,软键盘隐藏。
我做错什么了吗?

8fsztsew

8fsztsew1#

不确定为什么runOnUIthread要让键盘隐藏起来。
但是您可以尝试使用Handler将更新发布到UI。

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

kknvjkwl2#

我认为有两个选项,您可以使用它们来防止在UI Thread上发布时隐藏键盘:
首先,您可以将此代码(adjustPan)添加到保持器Activity中的清单XML文件中(如果您在Fragment中,请将其添加到调用该片段的Activity中):

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

调整平移
Activity的主窗口不会调整大小来为软键盘腾出空间。相反,窗口的内容会自动平移,以便当前焦点永远不会被键盘遮挡,用户始终可以看到他们正在键入的内容。这通常不如调整大小更理想,因为用户可能需要关闭软键盘才能访问窗口的遮挡部分并与之交互。
第二种选择是在发布到UI线程后使用软键盘的显式调用:

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

相关问题