web-dev-qa-db-ja.com

Android - EditTextで "Enter"を処理する

ユーザーを押す方法を処理する方法があるかどうか疑問に思います Enter EditTextを入力している間、onSubmit HTMLイベントのようなもの。

また、 "Done"ボタンに別のラベルを付けて( "Go"など)、クリックしたときに特定のアクションを実行する(onSubmitのように)ように仮想キーボードを操作する方法があるかどうか疑問に思います。

409
Felix

ユーザーを押す方法を処理する方法があるかどうか疑問に思います Enter EditTextを入力している間、onSubmit HTMLイベントのようなもの。

はい。

また、 "Done"ボタンに別のラベルを付けて( "Go"など)、クリックしたときに特定のアクションを実行する(onSubmitのように)ように仮想キーボードを操作する方法があるかどうか疑問に思います。

はい。

Android:imeActionId および Android:imeOptions 属性に加えて setOnEditorActionListener() メソッドをすべてTextViewで調べてみましょう。

[完了]ボタンのテキストをカスタム文字列に変更するには、次のようにします。

mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);
351
CommonsWare
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;
    }
});
225
Jarod DY Law

これがあなたのやり方です。 Android開発者のサンプルコード 'Bluetooth Chat'にも隠されています。 "example" と書かれている太字の部分は、独自の変数やメソッドに置き換えてください。

最初に、returnボタンに何か特別なことをさせたいメインActivityに必要なものをインポートします。

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

それでは、戻り値のキーにTextView.OnEditorActionListener型の変数を作成します(ここでは exampleListener を使用します)。

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

それから、戻るボタンが押されたときに何をすべきかについて2つのことをリスナーに伝える必要があります。どのEditTextについて話しているのか(ここでは exampleView を使用します)、そしてEnterキーが押されたときに何をするのかを知る必要があります(ここでは example_confirm() )。これがアクティビティの最後または唯一のEditTextの場合は、送信ボタンのonClickメソッド(または[OK]、[確認]、[送信]、[保存]など)と同じ処理を実行します。

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

最後に、リスナーを設定します(おそらくあなたのonCreateメソッドで)。

exampleView.setOnEditorActionListener(exampleListener);
209
Chad Hedgcock

ハードウェアキーボードは常にenterイベントを生成しますが、ソフトウェアキーボードはsingleLine EditTextで異なるactionIDとnullを返します。このコードは、EditTextやキーボードの種類に関係なく、このリスナーが設定されているEditTextにユーザーがEnterキーを押すたびに応答します。

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

SingleLine = falseの場合のEnterキーのデフォルトの外観は、曲がった矢印のEnterキーパッドです。最後のEditTextでsingleLine = trueの場合、キーはDONEを表し、それ以前のEditTextではキーはNEXTを表します。デフォルトでは、この動作はすべてのVanilla、Android、およびGoogleのエミュレータで一貫しています。 scrollHorizo​​ntal属性は効果がありません。ソフト入力に対する電話の応答は製造元に任されており、エミュレータでもVanilla Level 16エミュレータはNEXTのactionIdとnullのためのnullで複数行およびscrollHorizo​​ntal EditTextに応答するため、nullテストは重要です。行事。

33
earlcasper

私はこれが1歳であることを知っています、しかし私はちょうどこれがEditTextのために完璧に働くことを発見しました。

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

それはテキストとスペース以外の何も防ぎます。タブ、 "return"( "\ n")、その他何もできませんでした。

20
Newbie

このページではこれを正確に行う方法について説明します。

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

Android:imeOptions を設定してから、onEditorActionで actionId を確認します。 imeOptionsを 'actionDone'に設定した場合、onEditorActionで 'actionId == EditorInfo.IME_ACTION_DONE'を確認します。また、Android:inputTypeを必ず設定してください。

これは上でリンクされた例からのEditTextです:

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

setImeOptions(int) 関数を使ってプログラム的に設定することもできます。上記の例のOnEditorActionListenerです。

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;
    }
});
16
Mike

Chadの回答の補遺(これは私にとってはほぼ完璧に機能した)と同じように、コードが2回実行されるのを防ぐためにKeyEventアクションタイプのチェックを追加する必要があることがわかりました。イベント)。

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

繰り返しのアクションイベント(エンターキーを押したまま)などについては http://developer.Android.com/reference/Android/view/KeyEvent.html を参照してください。

15
kermitology

私は同じような目的を持っていました。私はTextViewを拡張するAutoCompleteTextViewで(私がカスタマイズしたい)キーボードの「Enter」キーを押すことを解決したかった。私は上とは異なる解決策を試しましたが、それらはうまくいったようです。しかし、私のデバイスの入力タイプ(AOKP ROM搭載のNexus 4)をSwiftKey 3(完全に機能していた)から標準のAndroidキーボード(リスナーからのコードを処理する代わりに新しい行)に切り替えたときに問題が発生しましたこの問題を処理するのにしばらく時間がかかりましたが、どの入力タイプを使用しても、すべての状況で問題が解決するかどうかはわかりません。

だからここに私の解決策があります:

XmlのTextViewの入力タイプ属性を "text"に設定します。

Android:inputType="text"

キーボードの「Enter」キーのラベルをカスタマイズします。

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

OnEditorActionListenerを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;
    }
});

これが他の人が私の問題を回避するのに役立つことを願っています。

15
kaolick

Xmlで、imeOptions属性をeditTextに追加します

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

次に、あなたのJavaコードで、同じEditTextにOnEditorActionListenerを追加します。

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

これが説明です。imeOptions = actionDoneはEnterKeyに "actionDone"を割り当てます。キーボードのEnterKeyが "Enter"から "Done"に変わります。それでEnterキーが押されると、それはこの動作を引き起こすでしょう、そしてあなたはそれを処理するでしょう。

11
Akshayraj Kore

またそれをすることができます。

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;
        }
    });
7
Xar E Ahmer
     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;
        }
    });

私にとってはとてもうまくいく
またキーボードを隠す

5
V. Kalyuzhnyu

まず、EditTextがキーを押すのを待つように設定する必要があります。

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

}

次に、キーを押したときのイベント、たとえばTextViewのテキストを設定するためのイベントを定義します。

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

}

そして最後に、EditText、TextView、OnKeyListener、KeyEventを上にインポートすることを忘れないでください。

import Android.view.KeyEvent;
import Android.view.View.OnKeyListener;
import Android.widget.EditText;
import Android.widget.TextView;
3
LifeiSHot

完璧に働いています

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

        }
    });
}

}

完璧に働いています

3
Domi mtz
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" />
3
kreker

これはうまくいくはずです

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!");
                    }
           }
          });
3
ORY

エディターにこのコードを入力して、必要なモジュールをインポートできるようにします。

 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;
        }
    });
2
Sanjit Prasad

これはLG Android携帯では正常に機能します。 ENTERや他の特殊文字が通常の文字として解釈されるのを防ぎます。 NextまたはDoneボタンが自動的に表示され、ENTERは正常に機能します。

edit.setInputType(InputType.TYPE_CLASS_TEXT);
2
Milan Švec

EditTextの<enter>に応答する信頼できる方法は、 TextWatcherLocalBroadcastManager 、および BroadcastReceiver です。 LocalBroadcastManagerを使用するには、 v4サポートライブラリ を追加する必要があります。 vogella.com :7.3「LocalBroadcastManagerを使ったローカルブロードキャストイベント」のチュートリアルを使用しています。 onTextChangedに  です 変更の終わりのインデックス 変更前>;マイナススタートTextWatcher内でUIスレッドがeditTextの編集可能項目の更新に忙しいとき、UIスレッドがeditTextの更新を終えたときにBroadcastReceiverを起こすインテントを送ります。

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
1
earlcasper

これは、ユーザーがハードウェアまたはソフトウェアキーボードのリターンキーを押すとコードを実行する、UtilsクラスまたはKeyboardsクラスに投入できる単純な静的関数です。これは@ 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;
        }
    };
}
1
JohnnyLambada
   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;
        }
    });
1
Brinda Rathod

テキストフィールドのInputTypeは、CommonsWareが動作するように言うためにtextでなければなりません。これらすべてを試しただけで、試行前にinputTypeがなく、何も機能しませんでした。Enterはソフトenterとして登録し続けました。 inputType = textの後、setImeLabelを含むすべてがうまくいきました。

例: Android:inputType="text"

1
Odaym

この質問にはまだ回答がありません。

レイアウト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;
}
0

これらの依存関係を追加すれば、うまくいくはずです。

import Android.view.KeyEvent;
import Android.view.View;
import Android.widget.EditText;
0
Jacky Supit