web-dev-qa-db-ja.com

ActionDoneボタン(Enterボタンなし)でマルチラインEditTextを実装する方法

メッセージ(電子メール、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ボタンの両方を維持するにはどうすればよいですか?

21
Ruslan

最後に、ここで同様のスレッドを検索した後、解決策を見つけました。アクティビティ/フラグメントにこれらの行を追加するだけです:

editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);

何らかの理由で、xmlからまったく同じ設定を適用すると機能しません。プログラムで行う必要があります。

EditTextから派生して手動でEditorInfo.IME_ACTION_DONEを適用することもできます。しかし、私にとって最初の解決策はより単純に見えます。

32
Ruslan

使用する

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
editText.setRawInputType(InputType.TYPE_CLASS_TEXT);

そしてXMLで:

Android:inputType="textMultiLine"

ソース: [完了]アクションボタンのある複数行のEditText

34
Rathi J

続くRuslanの答え。トリックは機能しましたが、XMLで注意する必要があることがもう1つあります。

EditTextには入力タイプtextが必要です。それ以外の場合はactionDoneは機能しません。デフォルトの入力タイプEditTextではユーザーが改行を入力できるため、inputTypeはtextに設定する必要があります。

Android:inputType="text"
//And of course
Android:imeOptions="actionDone"

そして、Javaクラスに追加する必要があります:

editText.setHorizontallyScrolling(false);
16
Noman Rafique

再利用可能なKotlinソリューション

これらの値を設定する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()
0
Gibolt