簡體   English   中英

runOnUIThread for Android 隱藏軟鍵盤

[英]runOnUIThread for Android is hiding the soft keyboard

在我的android應用中,核心邏輯寫在C++中。因此對於多種場景,會發生JNI調用。

在一個用例中,當用戶在“EditText”中輸入文本時,我調用了一個 JNI 方法,它將每個單詞大寫(邏輯和結果可能因情況而異)。

TextChange 處理程序調用 JNI function,它將在工作線程中將文本中的每個單詞大寫,然后使用“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 function 大寫,並且 EditText 中的文本也會更新。 但是,焦點消失了,cursor 不可見並且鍵盤被隱藏。

當我在文本字段中輸入時,觀察到同樣的情況,並且一些工作線程調用了一些 java 方法來“runOnUIthread” - 焦點丟失並且軟鍵盤被隱藏。

我做錯了什么嗎?

不確定為什么runOnUIthread使鍵盤隱藏。

但是您可以嘗試使用Handler將更新發布到 UI。

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

我認為有兩種選擇,您可以使用它來防止在 UI 線程上發帖時隱藏鍵盤:

首先,您可以在 holder 活動的清單 XML 文件中添加此代碼 ( adjustPan )(如果您在片段中,請將其添加到調用片段的活動中):

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

調整盤

該活動的主要 window 未調整大小以為軟鍵盤騰出空間。 相反,window 的內容會自動平移,以便當前焦點永遠不會被鍵盤遮擋,用戶始終可以看到他們正在輸入的內容。 這通常不如調整大小可取,因為用戶可能需要關閉軟鍵盤才能找到 window 的模糊部分並與之交互。

第二種選擇是在發布到 UI 線程后使用軟鍵盤的顯式調用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM