2.3でSoftInputアクションラベルが完了した複数行のEditText


82

マルチラインをEditText存在させ、Android 2.3でIMEアクションラベル「完了」を使用する方法はありますか?

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

EditText複数行用に構成する場合、Android 2.3では、ソフト入力キーボードの「完了」アクションを表示する機能が削除されます。

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


これがの宣言です 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

回答:


163

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面倒なレイアウト構成で実現できますが、私も強制しています。


24
私は通常、「omgthanks」のような一般的なコメントをしませんが、この回答は十分に役立ち、評価されていないため、認識に値すると思いました。要約すると、omgありがとう。:-)
プロウマン2011年

3
答えは+1ですが、この場合、コードから編集テキストの入力タイプを設定する場合。垂直スクロールを削除し、水平スクロールを追加します。この問題を解決するには、以下のコードを使用してください。editTextObj.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_MULTI_LINE); ビューを複数のレイアウトに含めて再利用している場合、一般的に発生する可能性があります。@ohhorobソリューションに感謝します。
Jayshil Dave 2012

2
それは魅力のように機能します!しかし、私はコードを本当に理解していません。フラグメカニズム全体について読むことができる場所がありますか?
vanleeuwenbram 2013年

おかげで、私は初心者です。ダイアログボックスを使用するアクティビティにこれを入れたEditTextので、アクティビティxmlにはありません。このコードをアクティビティに入れようとしましたが、エラーが発生しました:The method onCreateInputConnection(EditorInfo) of type SMSMain must override or implement a supertype methodsuper最初に電話するので、何が問題なのかわかりません。何か提案はありますか?ありがとう。
Azurespot 2015年

@NoniA。EditTextのサブクラスを作成する必要があります。そのクラスでは、このメソッドを呼び出す必要があります。EditTextに拡張するクラスを作成します。そのメソッドをそのクラスに入れます。
シャー

103

Ohhorobの答えは基本的に正しいですが、彼のコードは本当に冗長です!これは基本的に、このはるかに単純なバージョン(怠惰な読者のための完全なコード)と同等です。

package com.example.views;

import android.content.Context;
import android.util.AttributeSet;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.widget.EditText;

// An EditText that lets you use actions ("Done", "Go", etc.) on multi-line edits.
public class ActionEditText extends EditText
{
    public ActionEditText(Context context)
    {
        super(context);
    }

    public ActionEditText(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public ActionEditText(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs)
    {
        InputConnection conn = super.onCreateInputConnection(outAttrs);
        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
        return conn;
    }
}

これを機能させないinputTypeなどのいくつかのオプションに注意してくださいtextShortMessage!から始めることをお勧めしますinputType="text"。XMLで使用する方法は次のとおりです。

<com.example.views.ActionEditText
    android:id=...
    android:layout_stuff=...
    android:imeOptions="actionDone"
    android:inputType="textAutoCorrect|textCapSentences|textMultiLine"
    android:maxLines="3" />

ティムム、これは2.3でテストされていますか?
ohhorob 2012

1
コードが2.3で動作する場合は、マイニングする必要があります。それらはほとんど同じであり、私は私のコードまたはあなたのコードに基づいているので、ありがとう!4.0にはない2.3の特異性はありますか?標準の「複数行の編集に対するアクションなし」は、Googleによって追加された意図的な動作です。
Timmmm 2012

5
2.3(および4.x)でこれを試しましたが、アプリケーションで機能しました。
mlc 2012年

2
@ matej.smitalaええ、両方を持つことはできません。
Timmmm 2012

1
最良の解決策を何時間も探した後、これは、Enterキーなしで複数行の編集テキストを実現するための最良かつ最も簡単な方法のようです。
micnguyen 2014年

56

EditTextクラスをサブクラス化する別の解決策は、次のようにEditTextインスタンスを構成することです。

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

少なくとも、これはAndroid4.0では機能します。これは、IMEアクションが設定されている場合でも、ユーザーが複数行にソフトラッピングで表示される1行の文字列を編集するようにEditTextインスタンスを構成します。


2
@Futzilogik:あなた、サー、もっと多くの賛成に値する!この答えは命の恩人であり、単純なものでもありました。つまり、すごい。何度も賛成できたらいいのにと思います。どうもありがとう!
Swayam 2014年

3
私は4.4.2を実行していますが、これは私にとっても、少なくとも私のやり方でもうまくいきませんでした。XMLだけでやったので、それが問題かもしれません。inputTypeを "textEmailAddress | textMultiLine"に、scrollHorizo​​ntallyをfalseに、maxLinesを500(xmlファイル)に、singleLineをfalseに、imeOptionsをactionNextに構成しました。inputtypeから「textMultiLine」を削除してみました。textMultiLineを使用すると、キーボードのENTERキーを取得しますが、それがないと、すべてが1行に留まり、水平方向にスクロールします。これは最も簡単な解決策のように思えましたが、上記の解決策は私にとってはうまくいくので、今のところそれを使用します。
リアクティブコア

6
以前のコメント(編集できません)については、MAX_VALUEを設定していないか、編集テキストの作成後に変更しただけの問題であると思われ、ここに示すコードで試してみましたが、機能します!他の人のために投稿したかったのですが、XMLで投稿することはできません(またはとにかくできませんでした)。私が持っている他の設定:singleLine = false、imeOptions = actionNext、inputType = textEmailAddress(複数行なし)。
リアクティブコア

非常にうまく機能します。これは古い答えを改善する良い例です!!
nPn 2014

Lollipopを実行しているGalaxyS5で私のために働いています。素晴らしいソリューション。xmlで水平方向にスクロールを設定しても同じ効果がないのは不思議です
Scott Birksted 2016年

7

前の答えに続いて

public class MultiLineText extends EditText {

    public MultiLineText(Context context) {
        super(context);
    }

    public MultiLineText(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    public MultiLineText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

    }

    @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;
    }
}

このように使用します

<myapp.commun.MultiLineText
  android:id="@+id/textNotes"
  android:layout_height="wrap_content"
  android:minHeight="100dp"
  android:layout_width="wrap_content"
  android:hint="Notes"
  android:textSize="20sp"
  android:padding="7dp"
  android:maxLines="4"/> 

5

アクションDoneを配置するには、次を使用できます。

XML

android:inputType="text|textCapSentences"    

JAVA

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

私はあなたのためにその仕事を願っています。


1

どうやら元の質問に対する答えは「はい」ですが、Androidチームは、開発者に複数行のEditTextの使用方法について少し考えさせようとしていると思います。彼らはEnterキーで改行を追加することを望んでおり、おそらく編集が完了したというイベントを発生させるためのボタンまたは別の入力手段を提供することを期待しています。

私は同じ問題を抱えており、私の明らかな解決策は、完了ボタンを追加し、Enterボタンに改行を追加させることでした。


申し訳ありませんが、私の質問は十分に明確ではなかった可能性があります。複数行は、単一行の入力をソフトラッピングするためのものです。つまり、改行文字は使用できません。
ohhorob 2011年

@Mullins:SoftInputキーボードに独自の「完了」ボタンを追加しましたか?「Enter」を維持しながら、どのようにそれを行いましたか?
alex.veprik 2012

いいえ。キーボードとは別のUIに完了ボタンを作成しました。
マリンズ2012

1
たぶん、Androidチームは独自のアドバイスに従い、メッセージを送信する代わりに、メッセージングアプリの複数行のテキストエディットのアクションボタンに改行を作成させる必要があります。
Timmmm 2012

0

XMLでこれらの属性を使用します。

android:inputType = "textImeMultiLine"

android:imeOptions = "actionDone"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.