Android - Xử lý đỉnh Enter Enter trong một Chỉnh sửa


459

Tôi tự hỏi liệu có cách nào để xử lý người dùng nhấn Entertrong khi gõ một EditText, giống như sự kiện HTML onSubmit.

Cũng tự hỏi liệu có cách nào để thao tác bàn phím ảo theo cách mà nút "Xong" được gắn nhãn khác (ví dụ "Đi") và thực hiện một hành động nhất định khi nhấp (một lần nữa, như onSubmit).


1
Kotlin & Tiện ích mở rộng: hãy xem tại đây: stackoverflow.com/a/48810268/1912924
Francesco Donzello

Câu trả lời:


374

Tôi tự hỏi liệu có cách nào để xử lý người dùng nhấn Entertrong khi gõ vào EditText, một cái gì đó giống như sự kiện HTML onSubmit.

Đúng.

Cũng tự hỏi liệu có cách nào để thao tác bàn phím ảo theo cách mà nút "Xong" được gắn nhãn khác (ví dụ "Đi") và thực hiện một hành động nhất định khi nhấp (một lần nữa, như onSubmit).

Cũng có.

Bạn sẽ muốn xem xét android:imeActionIdandroid:imeOptionscác thuộc tính, cộng với setOnEditorActionListener()phương thức, tất cả trên TextView.

Để thay đổi văn bản của nút "Xong" thành chuỗi tùy chỉnh, hãy sử dụng:

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

26
(PS EditText mở rộng TextView, do đó tại sao các thuộc tính bạn nên xem là trên TextView - khi tôi đọc câu cuối cùng đó, tôi đã thực hiện hai lần :))
Ricket

15
Như một lưu ý. Không phải tất cả các bàn phím đều hỗ trợ thuộc tính android: imeOptions tiêu chuẩn. Đó là thực sự thất vọng. Ví dụ: IME_ACTION_DONE được định nghĩa là 6, trong đó bàn phím mặc định của HTC (Trên các điện thoại như Incredible, Evo 4G), phím trả về được xác định là 0.
fernferret

13
Ngoài ra nếu việc sử dụng imeOptions của bạn đảm bảo bạn cũng sử dụng inputType = "text" hoặc tương đương khác. Để đảm bảo bàn phím lắng nghe bạn! Nexus1
Blundell

6
"Có" - Bạn có thể mô tả nhiều hơn thế này không? Anh ta có thể sẽ hỏi làm thế nào để thực hiện giải pháp.
Al Wang

4
@AlWang: Đầu tiên, khu vực quan tâm của bạn được đề cập trong câu trả lời (xem bắt đầu bằng "Bạn sẽ muốn ..."). Thứ hai, câu trả lời này là từ sáu năm trước , và vì vậy người ta sẽ cho rằng vấn đề của OP đã được giải quyết. Rốt cuộc, OP đã chấp nhận câu trả lời.
CommonsWare

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
Vì một số lý do khi tôi nhấp entervào văn bản chỉnh sửa của mình, toàn bộ văn bản chỉnh sửa sẽ chuyển xuống ... Làm cách nào để khắc phục điều này?
Ruchir Baronia

1
@RuchirBaronia Thêm android: maxLines = "1" vào EditText của bạn. EditText của bạn không "di chuyển xuống", mà là chèn một ngắt dòng vào văn bản đã nhập. Đặt maxLines thành 1 sẽ ngăn chặn ngắt dòng.
lustig

3
Giải pháp này chỉ hoạt động cho bàn phím phần cứng, KHÔNG dành cho bàn phím mềm / ảo. Nếu bạn dựa vào nó, thì ứng dụng của bạn sẽ bị hỏng đối với người dùng mà không có bàn phím kèm theo.
dùng3562927

12
Không có vi phạm đến CommonsWare, nhưng câu trả lời của ông là RTFM cách ít hữu ích hơn ví dụ này đơn giản cho thấy chính xác làm thế nào để làm điều đó. Cảm ơn bạn!
Ứng dụng tự động

1
@AutonomousApps, tôi thường thấy câu trả lời của CommonsWare. Anh may mắn trả lời từ năm 2009, khi Android bắt đầu. Thường là "có", "không", "không thể", v.v., thường không có mã. Thường thì câu trả lời của anh ấy đã lỗi thời, vì vậy tôi cố gắng không làm theo khuyến nghị của anh ấy.
CoolMind

215

Đây là những gì bạn làm. Nó cũng được ẩn trong mã mẫu 'Trò chuyện Bluetooth' của Nhà phát triển Android. Thay thế các phần in đậm nói "ví dụ" bằng các biến và phương thức của riêng bạn.

Đầu tiên, nhập những gì bạn cần vào Hoạt động chính nơi bạn muốn nút quay lại thực hiện điều gì đó đặc biệt:

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

Bây giờ, tạo một biến kiểu TextView.OnEditorActionListener cho khóa trả về của bạn (ở đây tôi sử dụng exampleListener );

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

Sau đó, bạn cần nói với người nghe hai điều về những việc cần làm khi nhấn nút quay lại. Nó cần biết EditText chúng ta đang nói về điều gì (ở đây tôi sử dụng exampleView ), và sau đó nó cần biết phải làm gì khi nhấn phím Enter (ở đây, example_conf Confirm () ). Nếu đây là lần chỉnh sửa cuối cùng hoặc duy nhất trong Hoạt động của bạn, thì nó sẽ thực hiện tương tự như phương thức onClick cho nút Gửi (hoặc OK, Xác nhận, Gửi, Lưu, v.v.) của bạn.

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

Cuối cùng, đặt trình nghe (rất có thể trong phương thức onCreate của bạn);

exampleView.setOnEditorActionListener(exampleListener);

20
Thật tuyệt, tôi đã sử dụng EditorInfo.IME_ACTION_SEND và tôi có android: imeOptions = "actionSend" trên XML.
Bani

tìm kiếm EditorInfo.IME_ACTION_SEND không có tác dụng đối với tôi (trình giả lập) vì vậy với tư cách là trình kích hoạt hoàn hảo, tôi cũng đã tìm KeyEvent.KEYCODE_ENTER. Xem tại đây: stackoverflow.com/questions/2004344/ Mạnh
Ai đó ở đâu đó vào

4
Nó thường tốt hơn để thực hiện các hành động trên KeyEvent.ACTION_UP. Để làm việc này, trước tiên bạn cần sử dụng ACTION_DOWNsự kiện này : if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { return true; }. Sau đó, bạn có thể kiểm tra ACTION_UPsự kiện và thực hiện hành động (tương tự như câu trả lời ở trên). Nếu bạn không tiêu thụ ACTION_DOWNsự kiện này, thì onEditorActionbạn sẽ không được gọi ACTION_UP.
ashughes

2
Đây là những gì làm việc cho tôi: if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {...}- không thể có bất kỳ cách tiếp cận nào khác để làm việc
Jonathan Ellis

38

Bàn phím phần cứng luôn mang lại các sự kiện nhập, nhưng bàn phím phần mềm trả về các hành động và null khác nhau trong các Chỉnh sửa đơn. Mã này đáp ứng mỗi khi người dùng nhấn enter trong EditText mà trình nghe này đã được đặt thành, bất kể EditText hay loại bàn phím.

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

Giao diện mặc định của phím enter trong singleLine = false cung cấp cho bàn phím nhập mũi tên cong. Khi singleLine = true trong EditText cuối cùng, khóa sẽ ghi DONE và trên EditTexts trước khi nó báo NEXT. Theo mặc định, hành vi này phù hợp trên tất cả các trình giả lập vanilla, Android và google. Thuộc tính scrollHTHER không tạo ra bất kỳ sự khác biệt. Thử nghiệm null rất quan trọng vì phản hồi của điện thoại đối với nhập mềm được để lại cho nhà sản xuất và ngay cả trong trình giả lập, trình giả lập vanilla Cấp 16 phản hồi các nhập mềm dài trong nhiều dòng và cuộn Chỉnh sửa ngang với một hành động NEXT và null cho sự kiện.


Khi tôi nâng cấp Java, chuỗi công cụ Android của tôi bị hỏng. Đó là 32-bit. Tôi đã cài đặt lại mọi thứ 64-bit và phát hiện ra rằng có nhiều phiên bản giả lập công khai hơn hiện có. Tôi phải thừa nhận rằng tôi chỉ biết rằng hành vi của EditorActionListener phù hợp với các trình giả lập mà tôi đã thử nghiệm.
Earlcasper

Khi tôi đăng bài này lên blog của mình, một người nào đó đã nhận xét rằng để làm cho nó hoạt động trên nhật thực, bạn cần thay đổi hành động ime mặc định, thêm android: imeOptions =.
Earlcasper

Rất tiếc tôi đã đọc sai nhận xét về bài đăng trên blog của tôi. Để làm cho nó hoạt động trên nhật thực, bạn cần thay đổi hành động ime mặc định, thêm android: imeOptions = hành động hành động. đến 'EditText' trong bố cục xml.
Earlcasper

Để phản ánh thêm, bình luận cuối cùng của tôi đề cập đến cả Ant và Eclipse
Earlcasper

27

Trang này mô tả chính xác làm thế nào để làm điều này.

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

Đặt android: imeOptions sau đó bạn chỉ cần kiểm tra actionId trong onEditorAction. Vì vậy, nếu bạn đặt imeOptions thành 'actionDone' thì bạn sẽ kiểm tra 'actionId == EditorInfo.IME_ACTION_DONE' trong onEditorAction. Ngoài ra, hãy đảm bảo đặt android: inputType.

Đây là EditText từ ví dụ được liên kết ở trên:

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

Bạn cũng có thể thiết lập chương trình này bằng cách sử dụng hàm setImeOptions (int) . Đây là OnEditorActionListener từ ví dụ được liên kết ở trên:

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

Tôi biết đây là một năm tuổi, nhưng tôi chỉ phát hiện ra điều này hoạt động hoàn hảo cho một EditText.

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

Nó ngăn chặn bất cứ điều gì trừ văn bản và không gian. Tôi không thể tab, "return" ("\ n") hoặc bất cứ điều gì.


Làm việc cho tôi, với việc bổ sung IME_ACTION_DONE
htafoya

1
Hoạt động hoàn toàn tốt nếu bạn muốn tắt phím "Enter".
deeJ

16

Giống như phần phụ lục cho phản hồi của Chad (hoạt động gần như hoàn hảo đối với tôi), tôi thấy rằng tôi cần thêm một kiểm tra về loại hành động KeyEvent để ngăn mã của tôi thực thi hai lần (một lần bật phím và một lần vào phím biến cố).

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

Xem http://developer.android.com/reference/android/view/KeyEvent.html để biết thông tin về việc lặp lại các sự kiện hành động (giữ phím enter), v.v.


16

Tôi đã có một mục đích tương tự. Tôi muốn giải quyết bằng cách nhấn phím "Enter" trên bàn phím (mà tôi muốn tùy chỉnh) trong AutoCompleteTextView mở rộng TextView. Tôi đã thử các giải pháp khác nhau từ trên và chúng dường như hoạt động. NHƯNG Tôi đã gặp một số vấn đề khi chuyển loại đầu vào trên thiết bị của mình (Nexus 4 với ROM AOKP) từ SwiftKey 3 (nơi nó hoạt động hoàn hảo) sang bàn phím Android tiêu chuẩn (thay vì xử lý mã của tôi từ người nghe, một dòng mới là được nhập sau khi nhấn phím "Enter". Tôi phải mất một thời gian để xử lý vấn đề này, nhưng tôi không biết liệu nó có hoạt động trong mọi trường hợp cho dù bạn sử dụng loại đầu vào nào.

Vì vậy, đây là giải pháp của tôi:

Đặt thuộc tính loại đầu vào của TextView trong xml thành "text":

android:inputType="text"

Tùy chỉnh nhãn của phím "Enter" trên bàn phím:

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

Đặt OnEditorActionListener cho 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;
    }
});

Tôi hy vọng điều này có thể giúp những người khác tránh được những vấn đề tôi gặp phải, vì họ gần như khiến tôi phát điên.


Thật không may, điều này không hoạt động với phiên bản 4 mới của SwiftKey. Và nó lại khiến tôi phát điên ...: - /
kaolick

3
IF của bạn không chính xác. sử dụng: 'event.getKeyCode () == KeyEvent.KEYCODE_ENTER'
Loda

Hoàn hảo cho tôi. Ngoài ra, hãy nhớ chèn lại setImeActionLabel trong câu lệnh IF nếu không văn bản tùy chỉnh sẽ biến mất sau lần nhấn đầu tiên.
Steve Rogers

IF của anh ấy là chính xác, bởi vì anh ấy đặt hành động của mình thành KeyEvent.KEYCODE_ENTER ở trên :-D, nhưng vâng, mọi người khác có thể sẽ muốn sử dụng event.getKeyCode () == KeyEvent.KEYCODE_ENTER
Ray Hulha

15

Trong xml của bạn, hãy thêm thuộc tính imeOptions vào editText

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

Sau đó, trong mã Java của bạn, hãy thêm OnEditorActionListener vào cùng 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;
        }
    });

Dưới đây là lời giải thích- ImeOptions = actionDone sẽ gán "actionDone" cho EnterKey. EnterKey trong bàn phím sẽ thay đổi từ "Enter" thành "Xong". Vì vậy, khi nhấn phím Enter, nó sẽ kích hoạt hành động này và do đó bạn sẽ xử lý nó.


9

Bạn cũng có thể làm điều đó ..

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

Vì một số lý do khi tôi nhấp entervào văn bản chỉnh sửa của mình, toàn bộ văn bản chỉnh sửa sẽ chuyển xuống ... Làm cách nào để khắc phục điều này?
Ruchir Baronia

Tôi nghĩ rằng bạn muốn tìm hiểu stackoverflow.com/questions/10978038/ Từ othewise cho tôi xem xml của bạn
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;
        }
    });

Hoạt động rất tốt đối với tôi
Ngoài việc ẩn bàn phím


5

Trước tiên, bạn phải đặt EditText nghe phím bấm

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

}

Thứ hai, xác định sự kiện khi nhấn phím, ví dụ: sự kiện để đặt văn bản của 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;   

}

Và cuối cùng, đừng quên nhập EditText, TextView, OnKeyListener, KeyEvent ở trên cùng:

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

5

làm việc hoàn hảo

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

        }
    });
}

}

làm việc hoàn hảo


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

Điều này sẽ làm việc

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

Nhập mã này vào trình soạn thảo của bạn để nó có thể nhập các mô-đun cần thiết.

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

truy vấn = Tên của trường EditText và cũng thêm điều này -> (android: imeOptions = "actionSearch") trong xml của EditText.
Sanjit Prasad

3

Điều này hoạt động tốt trên điện thoại LG Android. Nó ngăn chặn ENTERvà các ký tự đặc biệt khác được hiểu là ký tự bình thường. Nexthoặc Donenút xuất hiện tự động và ENTERhoạt động như mong đợi.

edit.setInputType(InputType.TYPE_CLASS_TEXT);

Đây là điều DUY NHẤT làm việc cho tôi. Tôi có một chiếc Motorola Moto X 2 và thông thường nó có phím "Trả về" với mũi tên và mọi thứ. Điều này đã thay đổi nó thành một dấu kiểm và cuối cùng tôi đã có thể khiến người nghe làm việc với điều đó. (Trước khi nó chỉ tạo ra một dòng mới). Vì vậy, nếu có ai khác gặp phải vấn đề đó ...
cola huyền bí

2

Đây là một hàm tĩnh đơn giản mà bạn có thể ném vào Utilshoặc Keyboardslớp sẽ thực thi mã khi người dùng nhấn phím quay lại trên bàn phím phần cứng hoặc phần mềm. Đây là phiên bản sửa đổi của câu trả lời xuất sắc của @ 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;
        }
    };
}

Lưu ý rằng điều này sử dụng biểu thức lambda yêu cầu Java 1.8, nhưng nó đủ dễ để chuyển đổi nó thành không sử dụng lambda. Tuy nhiên, vấn đề tôi gặp phải với các loại giải pháp này là bàn phím ảo không tự động ẩn và nếu ở chế độ toàn màn hình (thiết bị nhỏ theo hướng ngang), chế độ toàn màn hình sẽ không tắt sau khi người dùng nhấn Enter hoặc DONE
jk7

2

InputType trên trường văn bản phải texttheo thứ tự mà CommonsWare đã nói để làm việc. Chỉ cần thử tất cả những điều này, không có InputType trước khi dùng thử và không có gì hoạt động, Enter tiếp tục đăng ký dưới dạng nhập mềm. SauinputType = text , mọi thứ bao gồm cả setImeLabel đều hoạt động.

Thí dụ : 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

Một cách đáng tin cậy để trả lời <enter> trong EditText là với TextWatcher , LocalBroadcastManagerBroadcastReceiver . Bạn cần thêm thư viện hỗ trợ v4 để sử dụng LocalBroadcastManager. Tôi sử dụng hướng dẫn tại vogella.com : 7.3 "Các sự kiện phát sóng cục bộ với LocalBroadcastManager" vì ví dụ mã ngắn gọn hoàn chỉnh của nó. Trong onTextChanged trướcchỉ số kết thúc thay đổi trước khi thay đổi >; trừ bắt đầu. Khi trong TextWatcher, luồng UI đang bận cập nhật có thể chỉnh sửa của editText, vì vậy chúng tôi gửi một Ý định để đánh thức BroadcastReceiver khi luồng UI được cập nhật xong chỉnh sửa.

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

Nếu sử dụng bất kỳ loại văn bản * đầu vào nào (ví dụ android:inputType="textCapSentences") thì trả về vận chuyển sẽ được lọc ra khỏi đầu vào để onTextChanged () không được gọi khi người dùng nhấn phím Enter.
jk7

1

Câu hỏi này chưa được trả lời với Butterknife

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>

ỨNG DỤNG 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 và Butterknife: THẮNG!
Javi

1

Sử dụng Kotlin Tôi đã tạo một chức năng xử lý tất cả các loại hành động giống như "đã hoàn thành" cho EditText, bao gồm cả bàn phím và cũng có thể sửa đổi nó và cũng xử lý các phím khác theo ý muốn:

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

Vì vậy, sử dụng mẫu:

        editText.setOnDoneListener({
            //do something
        })

Đối với việc thay đổi nhãn, tôi nghĩ rằng nó phụ thuộc vào ứng dụng bàn phím và nó thường chỉ thay đổi theo chiều ngang, như được viết ở đây . Dù sao, ví dụ sử dụng cho việc này:

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

Hoặc, nếu bạn muốn bằng XML:

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

Và kết quả (hiển thị trong cảnh quan):

nhập mô tả hình ảnh ở đây


0

Thêm các depencendy, và nó sẽ hoạt động:

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

0

Điều này sẽ cung cấp cho bạn một chức năng có thể gọi được khi người dùng nhấn phím quay lại.

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

Sử dụng

editText.setLineBreakListener {
    doSomething()
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.