🐬
Android のキーボードアプリを作った (Kotlin)
先日、メモアプリを作成してマークダウンの補助機能をキーボード内に埋め込みたいと思いました。色々調べた結果1からキーボードを作成しなければ自分のしたい事ができなかった為 Just for Fun で作成してみました。
Android Develper のインプットメソッドを作成するのページ
現在の selection の位置 (start と end), composingText と start の位置を onUpdateCursorAnchorInfo で取得する方法
class MarkdownIME: InputMethodService() {
override fun onCreateInputView(): View {
return layoutInflater.inflate(R.layout.main_layout, null).apply{
currentInputConnection.requestCursorUpdates(InputConnection.CURSOR_UPDATE_MONITOR)
}
}
override fun onUpdateCursorAnchorInfo(cursorAnchorInfo: CursorAnchorInfo?) {
Log.d("onUpdateCursorAnchorInfo: ",info.toString())
}
}
タップして Selection の位置を変えたときを取得する際に必要となりました。
Enter キーの挙動を EditorInfo の Type で変える方法
when(val type = currentInputEditorInfo.imeOptions and EditorInfo.IME_MASK_ACTION){
EditorInfo.TYPE_CLASS_NUMBER, EditorInfo.TYPE_CLASS_PHONE, EditorInfo.TYPE_CLASS_DATETIME ->{
currentInputConnection.performEditorAction(type)
}
else ->{
currentInputConnection.apply {
sendKeyEvent(
KeyEvent(
KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER
)
)
}
}
}
EditorInfo.TYPE_CLASS_NUMBER の EditText を使用している際, KeyEvent.KEYCODE_ENTER では入力を確定することができなかった。
かな漢字変換は OpenWnn を使用させて頂きました。使用した例
override fun onStartInput(attribute: EditorInfo?, restarting: Boolean) {
super.onStartInput(attribute, restarting)
val openWnnEngineJAJP = OpenWnnEngineJAJP(
"${context.filesDir.path}/writableJAJP.dic"
)
val composingText = ComposingText()
openWnnEngineJAJP.apply {
init()
setDictionary(0)
setKeyboardType(1)
}
val suggestions = mutableListOf<String>()
composingText.insertStrSegment(ComposingText.LAYER0,ComposingText.LAYER1, StrSegment("変換したい文字"))
openWnnEngineJAJP.convert(composingText)
for (i in 0 until text.size(ComposingText.LAYER2)) {
// 文節のその他の候補を取得できるようにします。
if (0 < openWnnEngineJAJP.makeCandidateListOf(i)) {
// 文節の変換候補を取得します。
var word: WnnWord?
while (openWnnEngineJAJP.nextCandidate.also { word = it } != null) {
suggestions.add(word?.candidate ?: "")
}
}
}
}
Discussion