Frage

Ich frage mich, ob es eine Möglichkeit ist, den Benutzer mit Enter während der Eingabe in einem EditText, so etwas wie das onSubmit HTML-Ereignisse zu behandeln.

auch fragen, ob es einen Weg gibt, um die virtuelle Tastatur in einer solchen Art und Weise, dass die Schaltfläche „Fertig“ etwas anderes markiert ist (zum Beispiel „Go“) und führt eine bestimmte Aktion, wenn darauf geklickt (wieder, wie onSubmit) zu manipulieren.

War es hilfreich?

Lösung

  

Ich frage mich, ob es einen Weg gibt, um   Griff der Benutzer mit Enter , während   Eingabe in einer EditText, so etwas wie   onSubmit HTML-Ereignis.

Ja.

  

fragen, auch wenn es eine Möglichkeit,   manipulieren die virtuelle Tastatur in   so, dass die Schaltfläche „Fertig“ ist   etikettiert etwas anderes (zB   „Go“) und führt eine bestimmte Aktion   wenn darauf geklickt wird (wieder, wie onSubmit).

Auch ja.

Sie werden an der android:imeActionId und android:imeOptions Attribute, plus die setOnEditorActionListener() Methode, die alle auf TextView.

Für den Text der Schaltfläche „Fertig“, um eine benutzerdefinierte Zeichenfolge zu ändern, verwenden Sie:

mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

Andere Tipps

final EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // If the event is a key-down event on the "enter" button
        if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
            (keyCode == KeyEvent.KEYCODE_ENTER)) {
          // Perform action on key press
          Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
          return true;
        }
        return false;
    }
});

Hier ist, was Sie tun. Es ist auch in dem Android Entwickler Beispielcode ‚Bluetooth Chat‘ versteckt. Ersetzen Sie die fett gedruckten Teile, die sagen, „Beispiel“ mit Ihrem eigenen Variablen und Methoden.

Als erstes importieren, was Sie in die Hauptaktivität benötigen, wo Sie die Return-Taste etwas Besonderes zu tun:

import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import android.view.KeyEvent;

Nun, machen Sie eine Variable vom Typ TextView.OnEditorActionListener für Ihre Return-Taste (hier I exampleListener );

TextView.OnEditorActionListener exampleListener = new TextView.OnEditorActionListener(){

Dann müssen Sie den Hörer zwei Dinge sagen, was zu tun ist, wenn die Return-Taste gedrückt wird. Es muss wissen, was EditText wir reden (hier verwende ich exampleView ), und dann muss er wissen, was zu tun ist, wenn die Enter-Taste gedrückt wird (hier example_confirm () ). Ist dies der letzte oder einzige EditText in Ihrer Aktivität ist, sollte es die gleiche Sache wie die onClick Methode tun für Senden (oder OK, bestätigen, Senden, Speichern, usw.) drücken.

public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
   if (actionId == EditorInfo.IME_NULL  
      && event.getAction() == KeyEvent.ACTION_DOWN) { 
      example_confirm();//match this behavior to your 'Send' (or Confirm) button
   }
   return true;
}

Schließlich, stellen Sie den Hörer (höchstwahrscheinlich in Ihrer onCreate-Methode);

exampleView.setOnEditorActionListener(exampleListener);

Hardware-Tastaturen liefern immer Ereignisse geben, aber Software-Tastaturen liefern unterschiedliche actionIDs und Nullen in single EditTexts. Dieser Code reagiert hat jedes Mal, drückt der Benutzer in einem EditText eingeben, dass diese Zuhörer, unabhängig von EditText oder Tastaturtyp eingestellt wurden.

import android.view.inputmethod.EditorInfo;
import android.view.KeyEvent;
import android.widget.TextView.OnEditorActionListener;

listener=new TextView.OnEditorActionListener() {
  @Override
  public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
    if (event==null) {
      if (actionId==EditorInfo.IME_ACTION_DONE);
      // Capture soft enters in a singleLine EditText that is the last EditText.
      else if (actionId==EditorInfo.IME_ACTION_NEXT);
      // Capture soft enters in other singleLine EditTexts
      else return false;  // Let system handle all other null KeyEvents
    }
    else if (actionId==EditorInfo.IME_NULL) { 
    // Capture most soft enters in multi-line EditTexts and all hard enters.
    // They supply a zero actionId and a valid KeyEvent rather than
    // a non-zero actionId and a null event like the previous cases.
      if (event.getAction()==KeyEvent.ACTION_DOWN); 
      // We capture the event when key is first pressed.
      else  return true;   // We consume the event when the key is released.  
    }
    else  return false; 
    // We let the system handle it when the listener
    // is triggered by something that wasn't an enter.


    // Code from this point on will execute whenever the user
    // presses enter in an attached view, regardless of position, 
    // keyboard, or singleLine status.

    if (view==multiLineEditText)  multiLineEditText.setText("You pressed enter");
    if (view==singleLineEditText)  singleLineEditText.setText("You pressed next");
    if (view==lastSingleLineEditText)  lastSingleLineEditText.setText("You pressed done");
    return true;   // Consume the event
  }
};

Die Standarddarstellung der Enter-Taste in single = false gibt einen gebogenen Pfeil Tastatur eingeben. Wenn single = true in der letzten EditText sagt der Schlüssel DONE und auf dem EditTexts bevor sie sagt, es WEITER. Standardmäßig ist dieses Verhalten konsistent über alle Vanille, Android und Google-Emulatoren. Das scrollHorizontal Attribut macht keinen Unterschied. Der Null-Test ist wichtig, weil die Reaktion von Telefonen weichen tritt den Hersteller überlassen und selbst in den Emulatoren, reagieren die Vanille-Stufe 16 Emulatoren zu lange weich tritt in mehreren Leitungen und scrollHorizontal EditTexts mit einem ActionID von NEXT und einem Null für das Ereignis.

Ich weiß, das ein Jahr alt ist, aber ich gerade entdeckt, das perfekt für einen EditText funktioniert.

EditText textin = (EditText) findViewById(R.id.editText1);
textin.setInputType(InputType.TYPE_CLASS_TEXT);

Es verhindert, dass alles andere als Text und Raum. Ich kann nicht Registerkarte "Rückkehr" ( "\ n"), oder irgendetwas.

Diese Seite beschreibt, wie genau dies zu tun.

https://developer.android.com/training/keyboard-input/style.html

Stellen Sie den android: imeOptions dann überprüfen Sie einfach die ActionID in onEditorAction. Also, wenn Sie imeOptions zu ‚actionDone‘ gesetzt, dann würden Sie prüfen ‚ActionID == EditorInfo.IME_ACTION_DONE‘ in onEditorAction. Stellen Sie außerdem sicher, dass die Android setzen:. Input

Hier ist die EditText aus dem Beispiel oben verlinkten:

<EditText
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_hint"
    android:inputType="text"
    android:imeOptions="actionSend" />

Sie können dies auch programmatisch setzen die setImeOptions mit (int) Funktion. Hier sind die OnEditorActionListener aus dem obigen Beispiel verknüpft:

EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            sendMessage();
            handled = true;
        }
        return handled;
    }
});

So wie ein Nachtrag zur Tschad Antwort (die für mich nahezu perfekt gearbeitet hat), fand ich, dass ich brauchte eine Überprüfung des KeyEvent Aktionstyp hinzuzufügen, meinen Code zu verhindern, dass die Ausführung zweimal (einmal auf dem Schlüssel-up und einmal auf dem Schlüssel-down Ereignis).

if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN)
{
    // your code here
}

Siehe http://developer.android.com/reference/android/view /KeyEvent.html für Informationen über Aktionsereignisse zu wiederholen (halten der Enter-Taste) etc.

Ich hatte einen ähnlichen Zweck. Ich wollte auf der Tastatur drücken Sie die „Enter“ -Taste lösen in einem AutoCompleteTextView (die ich anpassen wollte), die Textview erstreckt. Ich habe versucht, verschiedene Lösungen von oben und sie schien zu funktionieren. ABER ich erleben einige Probleme, wenn ich den Eingangstyp auf meinem Gerät (Nexus 4 mit AOKP ROM) von SwiftKey 3 geschaltet (wo es funktionierte perfekt) auf die Standard-Android-Tastatur (wo anstelle meinen Code vom Hörer der Handhabung, eine neue Linie war eingegeben, nachdem die Taste „Enter“ drücken. es dauerte eine Weile, um dieses Problem zu umgehen, aber ich weiß nicht, ob es egal, unter allen Umständen funktioniert, welcher Eingabetyp verwenden Sie.

hier ist also meine Lösung:

Stellen Sie das Eingangstyp-Attribut des Textview in den xml "text":

android:inputType="text"

Passen Sie das Etikett der „Enter“ -Taste auf der Tastatur:

myTextView.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

Stellen Sie eine OnEditorActionListener auf die Textview:

myTextView.setOnEditorActionListener(new OnEditorActionListener()
{
    @Override
    public boolean onEditorAction(TextView v, int actionId,
        KeyEvent event)
    {
    boolean handled = false;
    if (event.getAction() == KeyEvent.KEYCODE_ENTER)
    {
        // Handle pressing "Enter" key here

        handled = true;
    }
    return handled;
    }
});

Ich hoffe, das anderen helfen kann, die Probleme, die ich hatte zu vermeiden, weil sie trieb mich fast verrückt.

In Ihrem xml fügt die imeOptions Attribut auf den editText

<EditText
    android:id="@+id/edittext_additem"
    ...
    android:imeOptions="actionDone"
    />

Dann in Ihrem Java-Code, fügen Sie den OnEditorActionListener auf den gleichen EditText

mAddItemEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(actionId == EditorInfo.IME_ACTION_DONE){
                //do stuff
                return true;
            }
            return false;
        }
    });

Hier ist die explanation- Die imeOptions = actionDone wird "actionDone" der EnterKey zuweisen. Die EnterKey in der Tastatur wird von „Enter“ auf „Done“ ändern. Also, wenn Enter-Taste gedrückt wird, wird es diese Aktion auslösen und so werden Sie damit umgehen.

Sie können es auch tun ..

editText.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event)
            {
                if (event.getAction() == KeyEvent.ACTION_DOWN
                        && event.getKeyCode() ==       KeyEvent.KEYCODE_ENTER) 
                {
                    Log.i("event", "captured");

                    return false;
                } 

            return false;
        }
    });
     password.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
                submit.performClick();
                return true;
            }
            return false;
        }
    });

Funktioniert sehr gut für mich
Zusätzlich verbergen Tastatur

funktionierend

public class MainActivity extends AppCompatActivity {  
TextView t;
Button b;
EditText e;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    b = (Button) findViewById(R.id.b);
    e = (EditText) findViewById(R.id.e);

    e.addTextChangedListener(new TextWatcher() {

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

            if (before == 0 && count == 1 && s.charAt(start) == '\n') {

                b.performClick();
                e.getText().replace(start, start + 1, ""); //remove the <enter>
            }

        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
        @Override
        public void afterTextChanged(Editable s) {}
    });

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            b.setText("ok");

        }
    });
}

}

funktionierend

Zuerst müssen Sie festlegen EditText auf Tastendruck hören

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 

    // Set the EditText listens to key press
    EditText edittextproductnumber = (EditText) findViewById(R.id.editTextproductnumber);
    edittextproductnumber.setOnKeyListener(this);

}

Zweitens, das Ereignis auf dem Tastendruck definieren, beispielsweise Ereignis Textview Text zu setzen:

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub

 // Listen to "Enter" key press
 if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER))
 {
     TextView textviewmessage = (TextView) findViewById(R.id.textViewmessage);
     textviewmessage.setText("You hit 'Enter' key");
     return true;
 }

return false;   

}

Und schließlich, vergessen Sie nicht EditText, Textview, OnKeyListener, KeyEvent oben zu importieren:

import android.view.KeyEvent;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId != 0 || event.getAction() == KeyEvent.ACTION_DOWN) {
                // Action
                return true;
            } else {
                return false;
            }
        }
    });

XML

<EditText
        android:id="@+id/editText2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:imeOptions="actionGo|flagNoFullscreen"
        android:inputType="textPassword"
        android:maxLines="1" />

Das sollte funktionieren

input.addTextChangedListener(new TextWatcher() {

           @Override
           public void afterTextChanged(Editable s) {}

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

           @Override    
           public void onTextChanged(CharSequence s, int start,
             int before, int count) {
               if( -1 != input.getText().toString().indexOf( "\n" ) ){
                   input.setText("Enter was pressed!");
                    }
           }
          });

Dies funktioniert auf LG Android-Handys. Es verhindert, dass ENTER und andere Sonderzeichen als normale Zeichen interpretiert werden. Next oder Done Taste erscheint automatisch und ENTER wie erwartet funktioniert.

edit.setInputType(InputType.TYPE_CLASS_TEXT);

Hier ist eine einfache statische Funktion, die Sie in Ihrer Utils oder Keyboards Klasse werfen können, den Code ausgeführt wird, wenn der Benutzer die Return-Taste auf einer Hardware- oder Software-Tastatur trifft. Es ist eine modifizierte Version der ausgezeichneten Antwort des @ earlcasper

 /**
 * Return a TextView.OnEditorActionListener that will execute code when an enter is pressed on
 * the keyboard.<br>
 * <code>
 *     myTextView.setOnEditorActionListener(Keyboards.onEnterEditorActionListener(new Runnable()->{
 *         Toast.makeText(context,"Enter Pressed",Toast.LENGTH_SHORT).show();
 *     }));
 * </code>
 * @param doOnEnter A Runnable for what to do when the user hits enter
 * @return the TextView.OnEditorActionListener
 */
public static TextView.OnEditorActionListener onEnterEditorActionListener(final Runnable doOnEnter){
    return (__, actionId, event) -> {
        if (event==null) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                // Capture soft enters in a singleLine EditText that is the last EditText.
                doOnEnter.run();
                return true;
            } else if (actionId==EditorInfo.IME_ACTION_NEXT) {
                // Capture soft enters in other singleLine EditTexts
                doOnEnter.run();
                return true;
            } else {
                return false;  // Let system handle all other null KeyEvents
            }
        } else if (actionId==EditorInfo.IME_NULL) {
            // Capture most soft enters in multi-line EditTexts and all hard enters.
            // They supply a zero actionId and a valid KeyEvent rather than
            // a non-zero actionId and a null event like the previous cases.
            if (event.getAction()==KeyEvent.ACTION_DOWN) {
                // We capture the event when key is first pressed.
                return true;
            } else {
                doOnEnter.run();
                return true;   // We consume the event when the key is released.
            }
        } else {
            // We let the system handle it when the listener
            // is triggered by something that wasn't an enter.
            return false;
        }
    };
}

Input auf dem Textfeld muss, um für text werden, was CommonsWare sagte zu arbeiten. all dies nur versucht, nicht input vor dem Prozess und nichts funktioniert, geben Sie so weich eingeben gehalten Registrierung. Nach inputType = text, alles, einschließlich der setImeLabel gearbeitet.

Beispiel: android:inputType="text"

   final EditText edittext = (EditText) findViewById(R.id.edittext);
    edittext.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                    (keyCode == KeyEvent.KEYCODE_ENTER)) {
                // Perform action on key press
                Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    });

Geben Sie diesen Code in Ihrem Editor, so dass es notwendig Module importieren kann.

 query.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
            if(actionId == EditorInfo.IME_ACTION_DONE
                || actionId == EditorInfo.IME_ACTION_DONE
                    || keyEvent.getAction() == KeyEvent.ACTION_DOWN
                        || keyEvent.getAction() == KeyEvent.KEYCODE_ENTER) {

                // Put your function here ---!

                return true;

            }
            return false;
        }
    });

Eine zuverlässige Art und Weise zu einem in einer EditText zu reagieren, ist mit einem TextWatcher , ein LocalBroadcastManager und ein BroadcastReceiver . Sie müssen die v4 Support-Bibliothek hinzufügen, um die LocalBroadcastManager zu verwenden. Ich benutze das Tutorial unter vogella.com : 7.3 "Local Broadcast Veranstaltungen mit LocalBroadcastManager" wegen seines vollständigen prägnanten Code Beispiel. In OnTextChanged vor ist der Index des Endes der Änderung vor der Änderung >; minus starten. Wenn in der TextWatcher der UI-Thread ist damit beschäftigt Aktualisierung editText des editierbar, so senden wir eine Absicht, die BroadcastReceiver aufzuwachen, wenn der UI-Thread editText getan aktualisiert.

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.Editable;
//in onCreate:
editText.addTextChangedListener(new TextWatcher() {
  public void onTextChanged
  (CharSequence s, int start, int before, int count) {
    //check if exactly one char was added and it was an <enter>
    if (before==0 && count==1 && s.charAt(start)=='\n') {
    Intent intent=new Intent("enter")
    Integer startInteger=new Integer(start);
    intent.putExtra("Start", startInteger.toString()); // Add data
    mySendBroadcast(intent);
//in the BroadcastReceiver's onReceive:
int start=Integer.parseInt(intent.getStringExtra("Start"));
editText.getText().replace(start, start+1,""); //remove the <enter>
//respond to the <enter> here

Fügen Sie diese depencendy, und es sollte funktionieren:

import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;

Diese Frage wurde noch nicht beantwortet mit Buttermesser

LAYOUT XML

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/some_input_hint">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/textinput"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:imeOptions="actionSend"
            android:inputType="text|textCapSentences|textAutoComplete|textAutoCorrect"/>
    </android.support.design.widget.TextInputLayout>

JAVA APP

@OnEditorAction(R.id.textinput)
boolean onEditorAction(int actionId, KeyEvent key){
    boolean handled = false;
    if (actionId == EditorInfo.IME_ACTION_SEND || (key.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
        //do whatever you want
        handled = true;
    }
    return handled;
}

Kotlin

editTextVar?.setOnKeyListener { v, keyCode, event ->
            if((event.action == KeyEvent.ACTION_DOWN)
                && (event.keyCode == KeyEvent.KEYCODE_ENTER)){
                //Do something, such as loadJob()
                loadJob()
                return@setOnKeyListener true
            }

            false
        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top