Android-EditTextで「Enter」を処理する


459

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

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


1
Kotlinと拡張機能:ここをご覧ください:stackoverflow.com/a/48810268/1912924
Francesco Donzello

回答:


374

EnteronSubmit HTMLイベントのように、EditTextの入力中にユーザーが押す操作を処理する方法があるかどうか疑問に思っています。

はい。

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

はい。

android:imeActionIdandroid:imeOptions属性、およびsetOnEditorActionListener()メソッドをすべて確認する必要がありますTextView

「完了」ボタンのテキストをカスタム文字列に変更するには、以下を使用します。

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

26
(PS EditTextはTextViewを拡張するので、なぜあなたが見るべきプロパティがTextViewにあるのか-私が最後の文を最初に読んだとき、私はダブルテイクをしました:))
Ricket

15
注として。すべてのキーボードが標準のandroid:imeOptions属性をサポートしているわけではありません。これは本当にがっかりです。例えば、IME_ACTION_DONEはHTCのデフォルトのキーボード(信じられないほど、エボ4Gのような携帯電話で)リターンキーを0として定義され、6のように定義される
fernferret

13
また、imeOptionsを使用している場合は、inputType = "text"または他の同等のものも使用するようにしてください。キーボードがあなたの言うことを確実に聞くために!Nexus1
Blundell

6
「はい」-これより説明的になりますか?彼はおそらくソリューションを実装する方法を尋ねるでしょう。
アル王

4
@AlWang:最初に、関心のある領域が回答でカバーされます(「あなたは...から始めます」を参照してください)。第2に、この回答は6年前のものであり、OPの問題が解決されたと推測されます。結局、OPは答えを受け入れました。
CommonsWare、2015年

267
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
何らかの理由でenterエディットテキストをクリックすると、エディットテキスト全体が下に移動します...どうすれば修正できますか?
Ruchir Baronia 2016

1
@RuchirBaronia EditTextにandroid:maxLines = "1"を追加します。EditTextは「下に移動」するのではなく、入力したテキストに改行を挿入します。maxLinesを1に設定すると、改行が挿入されなくなります。
lustig

3
このソリューションはハードウェアキーボードでのみ機能し、ソフト/仮想キーボードでは機能しません。それに依存している場合、キーボードが接続されていないユーザーのアプリは壊れます。
user3562927 2017

12
CommonsWare、彼のRTFMの答えに悪気はなかった方法でそれを行う方法を正確に示す。この簡単な例未満便利。ありがとうございました!
AutonomousApps

1
@AutonomousApps、私はCommonsWareの回答をよく見ます。Androidが始まった2009年以来、彼は幸運にも答えてくれました。多くの場合、「はい」、「いいえ」、「不可能」などがあり、通常はコードなしです。多くの場合、彼の回答は古くなっているので、私は彼の推奨事項には従わないようにしています。
CoolMind 2019

215

これがあなたのやることです。また、Android開発者のサンプルコード「Bluetoothチャット」にも隠されています。「例」と書かれている太字部分を独自の変数とメソッドに置き換えます。

最初に、必要なものをメインのアクティビティにインポートします。ここで、戻るボタンで特別なことを実行します。

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である場合、送信(またはOK、確認、送信、保存など)ボタンのonClickメソッドと同じことを行う必要があります。

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

20
EditorInfo.IME_ACTION_SENDを使用しましたが、XMLにandroid:imeOptions = "actionSend"があります。
バニ

EditorInfo.IME_ACTION_SENDを検索しても、私(エミュレーター)には影響がなかったため、絶対確実なトリガーとして、KeyEvent.KEYCODE_ENTERも検索しました。ここを参照してください:stackoverflow.com/questions/2004344/...
誰かのどこか

4
通常、でアクションを実行することをお勧めしKeyEvent.ACTION_UPます。これが機能するためには、まずACTION_DOWNイベントを消費する必要があります:if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { return true; }。次に、ACTION_UPイベントを確認してアクションを実行できます(上記の回答と同様)。ACTION_DOWNイベントを消費しない場合、はonEditorAction呼び出されませんACTION_UP
ashughes 2013

2
これは私にとってうまくいったものです:if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {...}-他のアプローチを機能させることができませんでした
ジョナサンエリス

38

ハードウェアキーボードは常に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を示します。デフォルトでは、この動作はすべてのバニラ、Android、およびGoogleエミュレータ全体で一貫しています。scrollHorizo​​ntal属性は何の違いもありません。ソフト入力に対する電話の応答はメーカーに任されているため、ヌルテストは重要であり、エミュレータでも、バニラレベル16エミュレータは、actionIdがNEXTで、nullがnullの複数行およびscrollHorizo​​ntal EditTextで長いソフト入力に応答します。行事。


Javaをアップグレードすると、Androidのツールチェーンが壊れました。32ビットでした。64ビットすべてを再インストールしたところ、現在利用可能なパブリックエミュレータのバージョンが他にもたくさんあることがわかりました。EditorActionListenerの動作が、テストしたエミュレータで一貫していることだけを知っていることを認めなければなりません。
Earlcasper

これをブログに投稿したところ、Eclipseで機能させるには、デフォルトのimeアクションを変更してandroid:imeOptions =” actionGo”を追加する必要があると誰かがコメントしました。
Earlcasper 2013

ブログ投稿のコメントを読み間違えました。Eclipseで動作させるには、android:imeOptions =” actionGo”を追加して、デフォルトのimeアクションを変更する必要があります。レイアウトxmlの「EditText」に。
Earlcasper 2013

さらなる反省について、私の最後のコメントはAntとEclipseの両方に言及しています
Earlcasper

27

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

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

android:imeOptionsを設定し、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;
    }
});

21

私はこれが1歳であることを知っていますが、これがEditTextに対して完全に機能することを発見しました。

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

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


IME_ACTION_DONEを追加して、私のために働いた
htafoya '29

1
「Enter」キーを無効にしたい場合は、完全に正常に動作します。
deeJ 2012

16

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

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

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


16

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

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

xmlのTextViewの入力タイプ属性を「テキスト」に設定します。

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

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


残念ながら、これはSwiftKeyの新しいバージョン4では機能しません。そして、それは私を再びナッツに駆り立てています...:-/
kaolick

3
IFが正しくありません。使用: 'event.getKeyCode()== KeyEvent.KEYCODE_ENTER'
Loda

私にぴったりです。また、IFステートメントにsetImeActionLabelを再度挿入することを忘れないでください。そうしないと、カスタムテキストが最初に押された後に消えます。
スティーブロジャース

彼は:-D上KeyEvent.KEYCODE_ENTERに彼のたActionを設定しますので、彼のIFは、正しいですが、そう皆はおそらくevent.getKeyCodeを(使用したいと思うでしょう)== KeyEvent.KEYCODE_ENTER
レイHulha

15

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

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

次に、Javaコードで、OnEditorActionListenerを同じ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;
        }
    });

説明は次のとおりです。imeOptions= actionDoneは、EnterKeyに「actionDone」を割り当てます。キーボードのEnterKeyが「Enter」から「Done」に変わります。したがって、Enterキーを押すと、このアクションがトリガーされ、処理されます。


9

それもできます。

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

何らかの理由でenterエディットテキストをクリックすると、エディットテキスト全体が下に移動します...どうすれば修正できますか?
Ruchir Baronia 2016

私はあなたがstackoverflow.com/questions/10978038/を学びたいと思うと思います...そうでなければ 、あなたのXMLを見せてください
Jawad Zeb

6
     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

まず、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;

5

完璧に働いています

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

        }
    });
}

}

完璧に働いています


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

4

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

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

4

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

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

                // Put your function here ---!

                return true;

            }
            return false;
        }
    });

query = EditTextフィールドの名前。また、EditTextのxmlにこれを追加します->(android:imeOptions = "actionSearch")。
Sanjit Prasad

3

これはLG Androidスマートフォンで正常に動作します。ENTERその他の特殊文字が通常の文字として解釈されるのを防ぎます。NextまたはDoneボタンが自動的に表示ENTERされ、期待どおりに機能します。

edit.setInputType(InputType.TYPE_CLASS_TEXT);

これは私のために働いた唯一のものです。私はMotorola Moto X 2を持っていますが、通常は矢印の付いた「Return」キーとすべてのものがあります。これにより、チェックマークに変更され、最終的にリスナーにそれを機能させることができました。(それが新しい行を作成する前に)。したがって、他の誰かがその問題を抱えている場合...
ミスティックコーラ

2

以下は、ユーザーがハードウェアまたはソフトウェアのキーボードでReturnキーを押したときにコードを実行するクラス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;
        }
    };
}

これはJava 1.8を必要とするラムダ式を使用していますが、ラムダを使用しないように変換するのは簡単です。ただし、これらのタイプのソリューションで私が見た問題は、仮想キーボードが自動的に非表示にならないことです。フルスクリーンモード(横向きの小型デバイス)の場合、ユーザーがEnterキーまたはDONEを押した後、フルスクリーンモードがオフになりません
jk7

2

CommonsWareが機能textするためには、テキストフィールドのInputType が必要です。このすべてを試してみましたが、試験前のinputTypeはなく、何も機能しませんでした。EnterはソフトEnterとして登録し続けました。の後inputType = text、setImeLabelを含むすべてが機能しました。

例: android:inputType="text"


2
   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

EditTextの<enter>に応答する信頼できる方法は、TextWatcherLocalBroadcastManager、およびBroadcastReceiverを使用することです。LocalBroadcastManagerを使用するには、v4サポートライブラリを追加する必要があります。私はvogella.comのチュートリアルを使用しています:7.3「LocalBroadcastManagerを使用したローカルブロードキャストイベント」は、完全な簡潔なコード例のためです。onTextChangedのbefore、変更前の変更の終了のインデックスです。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

text *入力タイプのいずれかを使用している場合(例android:inputType="textCapSentences":)、改行は入力から除外されるため、ユーザーがEnterキーを押してもonTextChanged()は呼び出されません。
jk7 2018年

1

この質問はバターナイフでまだ回答されていません

レイアウト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アプリ

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

TextInputLayoutおよびButterknife:WIN!
Javi

1

Kotlinを使用して、キーボードを含むEditTextのあらゆる種類の「完了」のようなアクションを処理する関数を作成しました。これを変更したり、他のキーを希望どおりに処理したりすることもできます。

private val DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(EditorInfo.IME_ACTION_SEND, EditorInfo.IME_ACTION_GO, EditorInfo.IME_ACTION_SEARCH, EditorInfo.IME_ACTION_DONE)
private val DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(KeyEvent.KEYCODE_ENTER, KeyEvent.KEYCODE_NUMPAD_ENTER)

fun EditText.setOnDoneListener(function: () -> Unit, onKeyListener: OnKeyListener? = null, onEditorActionListener: TextView.OnEditorActionListener? = null,
                               actionsToHandle: Collection<Int> = DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT,
                               keysToHandle: Collection<Int> = DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT) {
    setOnEditorActionListener { v, actionId, event ->
        if (onEditorActionListener?.onEditorAction(v, actionId, event) == true)
            return@setOnEditorActionListener true
        if (actionsToHandle.contains(actionId)) {
            function.invoke()
            return@setOnEditorActionListener true
        }
        return@setOnEditorActionListener false
    }
    setOnKeyListener { v, keyCode, event ->
        if (onKeyListener?.onKey(v, keyCode, event) == true)
            return@setOnKeyListener true
        if (event.action == KeyEvent.ACTION_DOWN && keysToHandle.contains(keyCode)) {
            function.invoke()
            return@setOnKeyListener true
        }
        return@setOnKeyListener false
    }
}

したがって、使用例:

        editText.setOnDoneListener({
            //do something
        })

ラベルの変更については、キーボードアプリに依存していると思います。また、ここに記載されているように、通常は横向きでのみ変更されると思います。とにかく、これの使用例:

        editText.imeOptions = EditorInfo.IME_ACTION_DONE
        editText.setImeActionLabel("ASD", editText.imeOptions)

または、XMLで必要な場合:

    <EditText
        android:id="@+id/editText" android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:imeActionLabel="ZZZ" android:imeOptions="actionDone" />

そして結果(横に表示):

ここに画像の説明を入力してください


0

これらの依存関係を追加すると、機能するはずです。

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

0

これにより、ユーザーがReturnキーを押したときに呼び出し可能な関数が提供されます。

fun EditText.setLineBreakListener(onLineBreak: () -> Unit) {
    val lineBreak = "\n"
    doOnTextChanged { text, _, _, _ ->
        val currentText = text.toString()

        // Check if text contains a line break
        if (currentText.contains(lineBreak)) {

            // Uncommenting the lines below will remove the line break from the string
            // and set the cursor back to the end of the line

            // val cleanedString = currentText.replace(lineBreak, "")
            // setText(cleanedString)
            // setSelection(cleanedString.length)

            onLineBreak()
        }
    }
}

使用法

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