メッセージ(電子メール、SMS)の内容を入力するために使用されるEditTextがあります。 ActionDoneボタンをクリックするとすぐにメッセージが投稿されるようにします。これには次のコードを使用します。
message.setOnEditorActionListener((textView, i, keyEvent) -> {
switch (i) {
case EditorInfo.IME_ACTION_DONE:
if (messageCanBePosted()) {
SoftKeyboard.hide(message);
postMessage();
return true;
} else {
return false;
}
default:
return false;
}
});
しかし、他のメッセンジャーアプリと同じように、このメッセージフィールドを複数行にしたいと思います。私はこの行でそれを達成できます:
Android:inputType="textMultiLine"
問題は、この行を追加した後、ActionDoneボタンがEnterボタンのように動作し始めることです。だから、キャッチするための私のコールバックEditorInfo.IME_ACTION_DONE
が呼び出されることはありません。したがって、ユーザーがそのボタンを押すたびに、カーソルはメッセージを投稿する代わりに新しい行に移動します。
EditTextの複数行の動作(複数行にテキストを表示する機能)とActionDoneボタンの両方を維持するにはどうすればよいですか?
最後に、ここで同様のスレッドを検索した後、解決策を見つけました。アクティビティ/フラグメントにこれらの行を追加するだけです:
editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);
何らかの理由で、xmlからまったく同じ設定を適用すると機能しません。プログラムで行う必要があります。
EditTextから派生して手動でEditorInfo.IME_ACTION_DONE
を適用することもできます。しかし、私にとって最初の解決策はより単純に見えます。
使用する
editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
そしてXMLで:
Android:inputType="textMultiLine"
続くRuslanの答え。トリックは機能しましたが、XMLで注意する必要があることがもう1つあります。
EditText
には入力タイプtext
が必要です。それ以外の場合はactionDone
は機能しません。デフォルトの入力タイプEditText
ではユーザーが改行を入力できるため、inputTypeはtext
に設定する必要があります。
Android:inputType="text"
//And of course
Android:imeOptions="actionDone"
そして、Javaクラスに追加する必要があります:
editText.setHorizontallyScrolling(false);
これらの値を設定するin code他の回答のおかげで私にとってはうまくいきました
edittext.inputType = EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
edittext.setHorizontallyScrolling(false)
edittext.maxLines = Integer.MAX_VALUE // Or your preferred fixed value
私はこれを頻繁に必要とするので、コードをきれいに保つためにこれを作りました:
fun EditText.multilineIme(action: Int) {
inputType = EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
horizontalScroll(false)
maxLines = Integer.MAX_VALUE
}
// Then just call
edittext.multilineIme(EditorInfo.IME_ACTION_DONE)
[完了]にオプションのカスタムアクションを追加する場合は、次を試してください。
fun EditText.multilineDone(callback: (() -> Unit) = null) {
val action = EditorInfo.IME_ACTION_DONE
multilineIme(action)
setOnEditorActionListener { _, actionId, _ ->
if (action == actionId) {
callback?.invoke()
true
}
false
}
}
}
// Then you can call
edittext.multilineDone { closeKeyboard() }
// or just
edittext.multilineDone()