2011-11-03 49 views
1

我試圖在Android上創建一個自定義鍵盤,其中一個附加按鈕可以啓動一個活動(在這種情況下,聽用戶說),並將其轉換爲文本,類似於Google的語音識別按鈕的工作方式。從IME啓動活動添加文本(Android)

我已經創建了自定義鍵盤(使用Android開發者頁面的SoftKeyboard演示)並單擊我添加的按鈕可以啓動語音監聽活動,並且當我記錄結果時,它們出來正確。但是,當我嘗試做這樣的事情:

getCurrentInputConnection().commitText(result, 1); //result is a String 

內的活動,我得不到結果。我已經確定getCurrentInputConnection()不是null,並且編輯器類型(當調用getCurrentInputEditorInfo()時)不是null類型,所以我知道我可以輸入文本作爲字符串,而不僅僅是逐個字符(正如建議here)。

我知道問題可能是我無法訪問我新推出的活動中的輸入連接,但正如我在其他地方發現的那樣,startActivityForResult不能從InputMethodServices工作。

基本上有什麼辦法來影響從我最近發佈的活動顯示的文本,或者是否有任何方式來設置一個監聽器來在活動結束後更改文本?

感謝您的任何幫助。

回答

0

gogisha,

我有一個類似的想法。該活動將是一個文本字符串列表,用於注入ime正在處理的文檔。這是我做到的。在IME

<activity 
     android:name="org.this_voice.prakeyboard.KeyboardMacros" 
     android:configChanges="keyboardHidden|orientation|screenSize" 
     android:excludeFromRecents="true" 
     android:label="@string/keyboardmacros" 
     android:screenOrientation="portrait" > 
    </activity> 

於是,我拿起轉義字符的代碼便可開始活動:

在清單中,我添加了一個活動

} else if (primaryCode == 27) {   
     Intent i = new Intent(this, KeyboardMacros.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     i.putExtra("MODE","okay"); 
     startActivity(i); 

但是有一個問題與ime開始onCreate活動。也許是一個Android錯誤/功能。所以我把這個活動的onCreate:

Intent origin = this.getIntent(); 
    String okay = origin.getStringExtra("MODE"); 
    if ((okay == null) || (!okay.matches("okay"))){ finish(); } 

所以,活性只有當我打的軟鍵發送27(ESC)開始。活動啓動後,會出現列表,用戶選擇文本,它到剪貼板活動負荷的項目,並且:

  String macro = dbs.get(result); 
      ClipboardManager clipboard = (ClipboardManager) 
       getSystemService(Context.CLIPBOARD_SERVICE); 
      clipboard.setText(macro); 
      finish(); 

於是我們又陷入與我們的輸入法編輯器。所以在ime.startInput中我們有:

ClipboardManager clipboard = (ClipboardManager) 
     getSystemService(Context.CLIPBOARD_SERVICE); 
    if (clipboard.hasText()){ 
     getCurrentInputConnection().commitText(clipboard.getText(), 1); 
     clipboard.setText(""); 

清除剪貼板很重要。我正在使用setText,以便我們與Android 8+兼容。它改變了11更有趣的東西。哦, 而在輸入法的onCreate,我們清除剪貼板,以及:

ClipboardManager clipboard = (ClipboardManager) 
     getSystemService(Context.CLIPBOARD_SERVICE); 
    clipboard.setText(""); 

希望這有助於。其實,我希望你從一年前問你的問題就已經知道了...... 最好的魚。