2017-07-18 46 views
5

開始設置光標InputConnection.commitText(CharSequence text, int newCursorPosition)文檔說newCursorPosition意味着:在插入的文本與InputConnection.commitText

INT:文本週圍的新的光標位置,在Java中的字符。 如果> 0,這是相對於文本的結尾 - 1;如果< = 0,則這是相對於文本開始的 。因此,值1將始終提前 光標到全文插入後的位置。注意 這意味着您不能將光標放在文本中,因爲 編輯器可以對您提供的文本進行修改,所以 不可能在那裏正確指定位置。

this example,如果我輸入兩個字符,然後將光標定位在它們之間像這樣

enter image description here

,然後輸入其他字符,這並不重要,如果我設置newCursorPosition01。遊標始終處於插入的末尾。例如調用

inputConnection.commitText("aaa", 0); 

inputConnection.commitText("aaa", 1); 

兩個顯示光標這樣的:

enter image description here

如果我做-1

inputConnection.commitText("aaa", -1); 

我得到這個

enter image description here

1-1結果預計按文檔。 爲什麼0未將光標置於插入的開頭?我希望0應該是這樣的

inputConnection.commitText("aaa", 0); 

enter image description here

,但事實並非如此。爲什麼不?

+0

爲什麼你顯示0的兩個不同的位置?也許0沒有效果? –

+0

在上一張圖片中,我展示了預期結果,而不是實際結果。 @AlexanderHiggins – Suragch

回答

3

這看起來像代碼中的缺陷,但你是法官。

看看replaceText()BaseInputConnection。我相信這是插入後放置光標的代碼。 (replaceText()commitText())調用。

在所引用的代碼中,a是選擇的開始。b是選擇端。由於在該例子中沒有選擇和光標是在索引1然後a == b == 1此外,新文本(aaa)沒有被插入(替換選擇[a,b])直到光標移動到新的選擇之後。

Selection.setSelection(content, newCursorPosition)設置光標位置,因此對於0和1,以產生在你的例子相同的定位,我希望的newCursorPosition導出值是兩個輸入相同。

在位置1定位在兩個8位的之間的光標,讓我們認爲通過下面的代碼:

if (newCursorPosition > 0) { 
    newCursorPosition += b - 1; 
} else { 
    newCursorPosition += a; 
} 

爲了您的1路輸入,newCursorPosition> 0,所以newCursorPosition = newCursorPosition + 1 - 1或1 。

爲了您的0輸入,newCursorPosition不是= 0,所以newCursorPosition = newCursorPosition + A(0 + 1)或1

由於兩個輸入產生相同的值,我希望Selection.setSelection(content, newCursorPosition)產生你看到的結果。

我還沒有完全按照此代碼的代碼,但我相信這是問題所在。我已在BaseInputConnection中執行newCursorPosition = 0newCursorPosition = 1的執行路徑,它使用帶API 21的Pixel仿真器,上面列出的內容也適用。

+0

重讀文檔,我可以理解「你不能將光標放在文本中」的含義。如果爲'newCursorPosition'選擇'0'可以將光標移動到插入的開始位置,那麼這實際上會允許您進行一些定位。就像你說的,它仍然感覺像一個缺陷,但也許這是一個可以理解的。 – Suragch

+0

@Suragch可能文檔應爲:「如果> = 0,則相對於文本的末尾 - 1;如果<0,則相對於文本的開頭。但是,我確實認爲光標可以放在插入的開始位置,但是這不一定是高要求的東西(我已經將你對'a'和'b'的解釋說明了)。 – Cheticamp