web-dev-qa-db-de.com

Eingabetaste in EditText verhindern, den Text jedoch immer noch als mehrzeilig anzeigen

Wie erstelle ich unter Android einen EditText, so dass der Benutzer keinen mehrzeiligen Text eingeben kann, die Anzeige jedoch immer noch mehrzeilig ist (d. H. Es erfolgt ein Zeilenumbruch anstelle des nach rechts gehenden Textes)?

Dies ähnelt der integrierten Anwendung SMS, bei der keine Zeilenumbrüche eingegeben werden können, der Text jedoch in mehreren Zeilen angezeigt wird.

62

Ich würde das Widget untergliedern und die Behandlung der Schlüsselereignisse überschreiben, um den Schlüssel Enter zu blockieren:

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

Dies ist eine Methode, bei der Sie die EditText-Klasse nicht überschreiben müssen. Sie fangen die Zeilenumbrüche einfach ab und ersetzen sie durch leere Zeichenfolgen.

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

Eigenschaft in XML

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

Dieser arbeitet für mich:

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

Es zeigt einen Smiley anstelle der Eingabetaste.

14
soger

Die Antwort von @Andreas Rudolph enthält einen kritischen Fehler und sollte nicht verwendet werden. Der Code verursacht eine IndexOutOfBoundsException, wenn Sie Text innerhalb der EditText einfügen, die mehrere Zeilenzeilen enthält. Dies wird durch den verwendeten Schleifentyp verursacht. Das Editable-Objekt ruft die afterTextChanged-Methode auf, sobald sich der Inhalt ändert (ersetzen, löschen, einfügen).

Korrekter Code:

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 ツ

Versuche dies:

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

Ich teste das und es scheint zu funktionieren:

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

Sie können es aus der XML-Datei wie folgt festlegen:

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

Android:inputType="text" darf nicht vergessen werden. Wenn Sie es nicht festlegen, funktioniert es nicht. Ich weiß nicht warum .. .. Vergessen Sie nicht, maxLines in Ihren bevorzugten Wert zu ändern.

3
Buddy

Einfach hinzufügen

        Android:singleLine="true"

zu Ihrem EditText

3

Hier ist eine richtigere Antwort, bei der die Eingabetaste auf der IME-Tastatur nicht angezeigt wird:

// 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);

Sie können auch setSingleLine(true) entweder durch einen expliziten Android:inputType in der XML-Layoutdatei oder setInputType(InputType.*) im Code ersetzen - wobei der verwendete Eingabetyp alles, was Sie wissen, die Eingabe auf einzelne Zeilen beschränkt (dh alles, was setSingleLine(true) aufruft implizit schon).


Erklärung:

Was setSingleLine(true) macht, ruft implizit implizit setHorizontallyScrolling(true) und setLines(1) auf und ändert einige IME-Tastatureinstellungen, um die Eingabetaste zu deaktivieren.

Der Aufruf von setLines(1) ist wie der Aufruf von setMinLines(1) und setMaxLines(1) in einem Aufruf.

Einige Eingabetypen (d. H. Die Konstanten von InputType.TYPE_*) rufen setSingleLine(true) implizit auf oder erzielen zumindest den gleichen Effekt.

Fazit:

Um das zu erreichen, was das OP wünscht, wirken wir diesen impliziten Einstellungen einfach entgegen, indem diese impliziten Aufrufe zurückgesetzt werden.

1
Jason Sparc

Die akzeptierte Antwort hat so gut funktioniert, bis ich Text mit Zeilenumbrüchen in den EditText kopiert habe. Also habe ich onTextContextMenuItem hinzugefügt, um die Einfüge-Aktion zu überwachen.

@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

Für einen URI können Sie Folgendes verwenden:

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

Ansonsten funktioniert Android:inputType="textPersonName", wie oben erwähnt, für andere EditText-Namen wie Benutzernamen usw.

0
farid_z

Hier ist die Lösung ....

<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"/>

Verwendung in Java-Klasse

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

Sie können die Aktionsschaltfläche vom Code aus ändern

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

Xml 

Android:inputType="textMultiLine"
0
Ali hasan
<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

Ich werde eine andere Option angeben, damit Sie EditText nicht unterordnen müssen. Erstellen Sie eine InputFilter, die Zeilenumbrüche herausfiltert. Dann benutze EditText.addInputFilter.

Der Quellcode für einen solchen Eingangsfilter ist hier: https://Gist.github.com/CapnSpellcheck/7c72830e43927380daf5205100c93977

Sie können im Konstruktor 0 übergeben, und es werden keine Zeilenumbrüche zugelassen. Sie können dies auch mit einem der anderen Optimierungen wie Android:imeOptions="actionDone" kombinieren, da dies die Benutzerfreundlichkeit einiger Geräte verbessert.

0
androidguy

Das Hinzufügen dieser Eigenschaft zu EditText XML funktioniert für mich:

Android:lines="1"

Die Benutzer können Zeilenumbrüche eingeben, aber die Variable EditText selbst wird nicht größer.

0
Matthew Quiros