1. ホーム
  2. android

[解決済み] 2.3でのDone SoftInput Action Labelを使った多行編集テキスト

2023-06-13 03:48:46

質問

複数行の EditText を表示し、Android 2.3のIME Action Label "Done"を使用する方法はありますか?

Android 2.2 では、エンターボタンは IME アクションラベル "Done"を表示するので、これは問題ではありません ( android:imeActionLabel="actionDone" ) を表示し、クリックされるとソフト入力を解除します。

を設定する場合 EditText を構成する場合、Android 2.3 ではソフト入力キーボードの "Done" アクションを表示する機能が削除されました。

私は、ソフト入力の入力ボタンの動作を変更するために KeyListener を使用して、ソフト入力エンター ボタンの動作を変更することができましたが、エンター ボタンはまだエンター キーのように見えます。


以下は EditText

<EditText
        android:id="@+id/Comment"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="0dp"
        android:lines="3"
        android:maxLines="3"
        android:minLines="3"
        android:maxLength="60"
        android:scrollHorizontally="false"
        android:hint="hint"
        android:gravity="top|left"
        android:textColor="#888"
        android:textSize="14dp"
        />
<!-- android:inputType="text" will kill the multiline on 2.3! -->
<!-- android:imeOptions="actionDone" switches to a "t9" like soft input -->

を確認すると inputType の値を確認すると、アクティビティでコンテンツビューを設定するロード後に、次のように表示されます。

inputType = 0x20001

というのは。

  • クラス = TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL
  • フラグ = InputType.TYPE_TEXT_FLAG_MULTI_LINE

どのように解決するのですか?

さて、再読したところ TextViewEditorInfo のドキュメントを見ると、プラットフォームが強制的に IME_FLAG_NO_ENTER_ACTION を強制することが明らかになりました。

<ブロッククオート

注意点として TextView は自動的に はこのフラグを設定します。 を自動的に設定します。

私の解決策は、サブクラス EditText をサブクラス化し、プラットフォームが設定した後にIMEオプションを調整することです。

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    InputConnection connection = super.onCreateInputConnection(outAttrs);
    int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION;
    if ((imeActions&EditorInfo.IME_ACTION_DONE) != 0) {
        // clear the existing action
        outAttrs.imeOptions ^= imeActions;
        // set the DONE action
        outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE;
    }
    if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
    }
    return connection;
}

上記では、強制的に IME_ACTION_DONE を強制していますが、これは面倒なレイアウト設定によって達成できることです。