Android Sử dụng nút Xong trên Bàn phím để bấm nút


131

Ok trong ứng dụng của tôi, tôi có một trường để người dùng nhập số. Tôi có trường được đặt thành chỉ chấp nhận số. Khi người dùng nhấp vào trường, nó sẽ đưa lên bàn phím. Trên bàn phím (trên ICS) có một nút thực hiện. Tôi muốn nút thực hiện trên bàn phím để kích hoạt nút gửi tôi có trong ứng dụng của mình. Mã của tôi là như sau.

package com.michaelpeerman.probability;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.util.Random;

public class ProbabilityActivity extends Activity implements OnClickListener {

private Button submit;
ProgressDialog dialog;
int increment;
Thread background;
int heads = 0;
int tails = 0;

public void onCreate(Bundle paramBundle) {
    super.onCreate(paramBundle);
    setContentView(R.layout.main);
    submit = ((Button) findViewById(R.id.submit));
    submit.setOnClickListener(this);
}

public void onClick(View view) {
    increment = 1;
    dialog = new ProgressDialog(this);
    dialog.setCancelable(true);
    dialog.setMessage("Flipping Coin...");
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    dialog.setProgress(0);
    EditText max = (EditText) findViewById(R.id.number);
    int maximum = Integer.parseInt(max.getText().toString());
    dialog.setMax(maximum);
    dialog.show();
    dialog.setOnCancelListener(new OnCancelListener(){

          public void onCancel(DialogInterface dialog) {

              background.interrupt();
              TextView result = (TextView) findViewById(R.id.result);
                result.setText("heads : " + heads + "\ntails : " + tails);


          }});


    background = new Thread(new Runnable() {
        public void run() {
            heads=0;
            tails=0;
            for (int j = 0; !Thread.interrupted() && j < dialog.getMax(); j++) {
                int i = 1 + new Random().nextInt(2);
                if (i == 1)
                    heads++;
                if (i == 2)
                    tails++;
                progressHandler.sendMessage(progressHandler.obtainMessage());
            }
        }
    });
    background.start();
}

Handler progressHandler = new Handler() {
    public void handleMessage(Message msg) {

        dialog.incrementProgressBy(increment);
        if (dialog.getProgress() == dialog.getMax()) {
            dialog.dismiss();
            TextView result = (TextView) findViewById(R.id.result);
            result.setText("heads : " + heads + "\ntails : " + tails);


        }
    }

};

}


Điều đó đề cập đến việc cập nhật hộp văn bản.
mpeerman

Những gì tôi muốn làm là cho nó quá kích hoạt một nút tôi đã có. Tôi không muốn thoát khỏi nút vì một số người có thể đang sử dụng bàn phím không có nút thực hiện.
mpeerman

Câu trả lời:


313

Bạn cũng có thể sử dụng cái này (đặt một trình lắng nghe đặc biệt được gọi khi một hành động được thực hiện trên EditText), nó hoạt động cả cho DONE và RETURN:

max.setOnEditorActionListener(new OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) {
                Log.i(TAG,"Enter pressed");
            }    
            return false;
        }
    });

1
Làm cách nào tôi có thể thiết lập nó để kích hoạt nhấp chuột khi tôi đã chạy khỏi nút gửi công khai void onClick (Xem chế độ xem) {
mpeerman

3
Bạn có thể di chuyển tất cả mã đó thành một hàm và sau đó gọi nó hoặc sử dụng biểu diễnClick ()
vladexologija

6
Điều này không hoạt động với tôi khi nhấn nút DONE, KeyEvent luôn không có giá trị .. tuy nhiên actionId được đặt thành EditorInfo.IME_ACTION_DONE và tôi đã có thể sử dụng thay thế. (Đây là trong Android 4.2.2 và thậm chí không khớp với tài liệu sdk của Android tại thời điểm này)
James

28

Bạn có thể thử với IME_ACTION_DONE.

Hành động này thực hiện một hoạt động được thực hiện trên mạng mà không có gì để nhập và IME sẽ bị đóng.

 Your_EditTextObj.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                boolean handled = false;
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                  /* Write your logic here that will be executed when user taps next button */


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

8
Điều này làm việc hoàn hảo cho tôi. Hãy cẩn thận về việc trả lại ĐÚNG. Bàn phím vẫn được hiển thị. Nếu bạn muốn ẩn bàn phím, hãy trả về SAI.
Matwosk

1
Hoạt động như đá quý!
sam

16

Thử cái này:

max.setOnKeyListener(new OnKeyListener(){
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event){
        if(keyCode == event.KEYCODE_ENTER){
            //do what you want
        }
    }
});

Khi bạn nhấn bất kỳ nút nào, chế độ xem của bạn sẽ tạo sự kiện onKey và khi keyCode khớp với nút bên phải, nó sẽ thực hiện điều bạn muốn
Roman Black

1
nút phải có trọng tâm
Jeffrey Blattman

8

Hãy thử điều này cho Xamarin.Android (Nền tảng chéo)

edittext.EditorAction += (object sender, TextView.EditorActionEventArgs e) {
       if (e.ActionId.Equals (global::Android.Views.InputMethods.ImeAction.Done)) {
           //TODO Something
       }
};

7

Giải pháp Kotlin

Cách cơ bản để xử lý hành động đã thực hiện trong Kotlin là:

edittext.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Call your code here
        true
    }
    false
}

Gia hạn Kotlin

Sử dụng điều này để gọi edittext.onDone {/*action*/}trong mã chính của bạn. Giữ cho nó dễ đọc và dễ bảo trì hơn

edittext.onDone { submitForm() }

fun EditText.onDone(callback: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            callback.invoke()
            true
        }
        false
    }
}

Đừng quên thêm các tùy chọn này vào edittext của bạn

<EditText ...
    android:imeOptions="actionDone"
    android:inputType="text"/>

Nếu bạn cần inputType="textMultiLine"hỗ trợ, hãy đọc bài viết này


4

Tôi đã sao chép mã sau từ AndroidStudio khi bạn tạo Đăng nhập. Tôi sử dụng các thuộc tính ime

Trong bố cục của bạn

<EditText android:id="@+id/unidades" android:layout_width="match_parent"
                    android:layout_height="wrap_content" android:hint="@string/prompt_unidades"
                    android:inputType="number" android:maxLines="1"
                    android:singleLine="true"
                    android:textAppearance="?android:textAppearanceSmall"
                    android:enabled="true" android:focusable="true"
                    android:gravity="right"
                    android:imeActionId="@+id/cantidad"
                    android:imeActionLabel="@string/add"
                    android:imeOptions="actionUnspecified"/>

Trong hoạt động của bạn

editTextUnidades.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == R.id.cantidad || actionId == EditorInfo.IME_NULL) {
                addDetalle(null);
                return true;
            }
            return false;
        }
    });

2

Bạn có thể thực hiện trên trình nghe chính:

public class ProbabilityActivity extends Activity implements OnClickListener, View.OnKeyListener {

Trong onCreate:

max.setOnKeyListener(this);

...

@Override
public boolean onKey(View v, int keyCode, KeyEvent event){
    if(keyCode == event.KEYCODE_ENTER){
        //call your button method here
    }
    return true;
}

1

Nếu bạn muốn bắt nút nhập bàn phím để thực hiện công việc mà bạn muốn thực hiện thông qua bất kỳ sự kiện nào như nhấp vào nút, bạn có thể viết mã đơn giản dưới đây cho chế độ xem văn bản đó

Edittext ed= (EditText) findViewById(R.id.edit_text);

ed.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Do you job here which you want to done through event
    }
    return false;
}
});

1

Bàn phím số và bàn phím số

Nếu bạn đang sử dụng bàn phím số, bạn phải loại bỏ bàn phím, nó sẽ giống như:

editText.setOnEditorActionListener { v, actionId, event ->
  if (action == EditorInfo.IME_ACTION_DONE || action == EditorInfo.IME_ACTION_NEXT || action == EditorInfo.IME_ACTION_UNSPECIFIED) {
      //hide the keyboard
      val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
      imm.hideSoftInputFromWindow(windowToken, 0)
      //Take action
      editValue.clearFocus()
      return true
  } else {
      return false
  }
}

0

Sử dụng lớp này trong bố trí của bạn:

public class ActionEditText extends EditText
{
    public ActionEditText(Context context)
    {
        super(context);
    }

    public ActionEditText(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public ActionEditText(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs)
    {
        InputConnection conn = super.onCreateInputConnection(outAttrs);
        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
        return conn;
    }

}

Trong xml:

<com.test.custom.ActionEditText
                android:id="@+id/postED"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@android:color/transparent"
                android:gravity="top|left"
                android:hint="@string/msg_type_message_here"
                android:imeOptions="actionSend"
                android:inputType="textMultiLine"
                android:maxLines="5"
                android:padding="5dip"
                android:scrollbarAlwaysDrawVerticalTrack="true"
                android:textColor="@color/white"
                android:textSize="20sp" />

0
max.setOnKeyListener(new OnKeyListener(){
  @Override
  public boolean onKey(View v, int keyCode, KeyEvent event){
    if(keyCode == event.KEYCODE_ENTER){
        //do what you want
    }
  }
});

1
Nhận xét về mã của bạn luôn cải thiện khả năng đọc câu trả lời ...
jAC

Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, không chỉ là người hỏi bây giờ! Vui lòng chỉnh sửa câu trả lời của bạn để thêm lời giải thích và đưa ra dấu hiệu về những hạn chế và giả định được áp dụng. Cũng không hại khi đề cập đến lý do tại sao câu trả lời này phù hợp hơn những câu trả lời khác.
Dev-iL

0

Edittext cuối cùng của bạn .setOnEditorActionListener gọi phương thức này tự động nhấn api

Tôi đã gọi trong Đăng nhậpActivity trong et_password

 et_Pass.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) {

                    Log.i(TAG,"Enter pressed");
                    Log.i(Check Internet," and Connect To Server");

                }
                return false;
            }
        });

Làm việc tốt


0

Và đây là phiên bản Kotlin:

editText.setOnEditorActionListener { v, actionId, event ->
  if(actionId == EditorInfo.IME_ACTION_DONE){
      //Put your action there
      true
  } else {
      false
  }
}
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.