web-dev-qa-db-ja.com

EditTextでEnterキーを禁止しますが、テキストは複数行として表示されます

AndroidでEditTextを作成して、ユーザーが複数行のテキストを入力できないようにしますが、表示はまだ複数行です(つまり、テキストの代わりにワードラップがあります右へ)?

これは、組み込みのSMSアプリケーションと似ていますが、改行を入力することはできませんが、テキストは複数行で表示されます。

64

ウィジェットをサブクラス化し、Enterキーをブロックするためにキーイベント処理をオーバーライドします。

class MyTextView extends EditText
{
    ...
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        if (keyCode==KeyEvent.KEYCODE_ENTER) 
        {
            // Just ignore the [Enter] key
            return true;
        }
        // Handle all other keys in the default way
        return super.onKeyDown(keyCode, event);
    }
}
46
Tony the Pony

これはメソッドであり、EditTextクラスをオーバーライドする必要はありません。改行をキャッチして空の文字列に置き換えるだけです。

myEditTextObject.addTextChangedListener(new TextWatcher() {

    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    public void afterTextChanged(Editable s) {

        for(int i = s.length(); i > 0; i--) {

            if(s.subSequence(i-1, i).toString().equals("\n"))
                s.replace(i-1, i, "");
        }

        String myTextString = s.toString();
    }
});
42
Andreas Rudolph

XMLのプロパティ

Android:lines="5"
Android:inputType="textPersonName"
24
sergey.n

これは私のために働く:

<EditText
    Android:inputType="textShortMessage|textMultiLine"
    Android:minLines="3"
    ... />

Enterキーの代わりにスマイリーが表示されます。

14
soger

@Andreas Rudolphが提供する回答には重大なバグが含まれているため、使用しないでください。複数の改行文字を含むIndexOutOfBoundsException内のテキストを貼り付けると、コードによりEditTextが発生します。これは、使用されるループのタイプが原因で、Editableオブジェクトは、その内容が変更(置換、削除、挿入)されるとすぐにafterTextChangedメソッドを呼び出します。

正しいコード:

edittext.addTextChangedListener(new TextWatcher() {

    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    public void afterTextChanged(Editable s) {
        /*
         * The loop is in reverse for a purpose,
         * each replace or delete call on the Editable will cause
         * the afterTextChanged method to be called again.
         * Hence the return statement after the first removal.
         * http://developer.Android.com/reference/Android/text/TextWatcher.html#afterTextChanged(Android.text.Editable)
         */
        for(int i = s.length()-1; i >= 0; i--){
            if(s.charAt(i) == '\n'){
                s.delete(i, i + 1);
                return;
            }
        }
    }
});
6
Rolf ツ

これを試して:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_ENTER)
    {
        //Nothing
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
5
Niranj Patel

私はこれをテストしていますが、うまくいくようです:

EditText editText = new EditText(context);
editText.setSingleLine(false);
editText.setInputType(Android.text.InputType.TYPE_CLASS_TEXT | Android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT);
5
Juan Carlos

次のようにxmlから設定できます。

Android:imeOptions="actionDone"
Android:inputType="text"
Android:maxLines="10"

Android:inputType="text"を忘れないでください。設定しないと機能しません。なぜだかわかりません。また、maxLinesを好みの値に変更することを忘れないでください。

3
Buddy

単に追加する

        Android:singleLine="true"

あなたのEditTextに

3

IMEキーボードにEnterキーが表示されない、より正しい答えを次に示します。

// IMPORTANT, do this before any of the code following it
myEditText.setSingleLine(true);

// IMPORTANT, to allow wrapping
myEditText.setHorizontallyScrolling(false);
// IMPORTANT, or else your edit text would wrap but not expand to multiple lines
myEditText.setMaxLines(6);

また、setSingleLine(true)を、XMLレイアウトファイル上の明示的なAndroid:inputType、またはコード上のsetInputType(InputType.*)のいずれかで置き換えることができます。入力を単一行のみに制限します(つまり、暗黙的にsetSingleLine(true)を呼び出すものはすべて)。


説明:

setSingleLine(true)が行うことは、setHorizontallyScrolling(true)およびsetLines(1)を暗黙的に呼び出すことと、IMEキーボード設定を変更してEnterキーを無効にすることです。

同様に、setLines(1)への呼び出しは、1回の呼び出しでsetMinLines(1)setMaxLines(1)を呼び出すようなものです。

一部の入力タイプ(つまり、InputType.TYPE_*の定数)は、暗黙的にsetSingleLine(true)を呼び出すか、少なくとも同じ効果を達成します。

結論:

そのため、OPが望むものを実現するために、これらの暗黙的な呼び出しを元に戻すことで、それらの暗黙的な設定に単純に対抗します。

3
Jason Sparc

コードからアクションボタンを変更できます

editText.imeOptions = EditorInfo.IME_ACTION_DONE
editText.setRawInputType(InputType.TYPE_CLASS_TEXT)

XML

Android:inputType="textMultiLine"
1
Ali hasan

改行を含むテキストをEditTextにコピーするまで、受け入れられた回答は非常にうまく機能しました。そこで、onTextContextMenuItemを追加して、貼り付けアクションを監視しました。

@Override
public boolean onTextContextMenuItem(int id) {
    boolean ret = super.onTextContextMenuItem(id);
    switch (id) {
        case Android.R.id.paste:
            onTextPaste();
            break;
    }
    return ret;
}

public void onTextPaste() {
    if (getText() == null)
        return;
    String text = getText().toString();
    text = text.replaceAll(System.getProperty("line.separator"), " ");
    text = text.replaceAll("\\s+", " ");
    setText(text);
}
1
Olayinka

[〜#〜] uri [〜#〜] の場合、次を使用できます。

Android:inputType="textUri"
Android:lines="1"
Android:maxLength="128"

さもないと Android:inputType="textPersonName"上記のように、ユーザー名などの他のEditTextで機能します。

0
farid_z

これが解決策です...

<EditText
   Android:id="@+id/editText"
   Android:layout_width="match_parent"
   Android:layout_height="wrap_content"
   Android:maxLength="150"                                 
   Android:textSize="15dp"
   Android:imeOptions="actionDone"
   Android:inputType="text|textMultiLine"/>

使用法Javaクラス

editText.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int keyCode, KeyEvent event) {

            if (keyCode==KeyEvent.KEYCODE_ENTER)
            {
                // Just ignore the [Enter] key
                return true;
            }
            // Handle all other keys in the default way
            return (keyCode == KeyEvent.KEYCODE_ENTER);
        }
    });
0
priyanka
    EditText textView = new EditText(activity);
    ...
    textView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
            if(KeyEvent.KEYCODE_ENTER == keyEvent.getKeyCode()) {
                return false;
            }
            ....... 

        }
    });
0
Gilad
<EditText 
  Android:id="@+id/Msg"
  Android:layout_width="fill_parent"
  Android:layout_height="wrap_content"              
  Android:layout_marginTop="5dip"
  Android:lines="5"
  Android:selectAllOnFocus="true"               
  Android:hint="Skriv meddelande...\n(max 100tkn)"/>


EditText et = (EditText)findViewById(R.id.Msg);
String strTmp = et.getText().toString();
strTmp = strTmp.replaceAll("\\n"," ");
0
Anders

EditTextをサブクラス化する必要がないように、別のオプションを提供します。改行を除外するInputFilterを作成します。次に、EditText.addInputFilterを使用します。

このような入力フィルターのソースコードは次のとおりです。 https://Gist.github.com/CapnSpellcheck/7c72830e43927380daf5205100c93977

コンストラクターで0を渡すことができ、改行は許可されません。また、これをAndroid:imeOptions="actionDone"などの他の微調整の1つと組み合わせることができます。これにより、一部のデバイスでのエクスペリエンスが向上します。

0
androidguy

このプロパティをEditText XMLに追加するとうまくいきます:

Android:lines="1"

ユーザーは改行文字を入力できますが、EditText自体の高さは増加しません。

0
Matthew Quiros