Android ใช้ปุ่มเสร็จสิ้นบนแป้นพิมพ์เพื่อคลิกปุ่ม


132

โอเคในแอปของฉันฉันมีช่องให้ผู้ใช้ป้อนตัวเลข ฉันตั้งค่าฟิลด์ให้ยอมรับเฉพาะตัวเลขเท่านั้น เมื่อผู้ใช้คลิกที่ฟิลด์จะแสดงแป้นพิมพ์ขึ้นมา บนแป้นพิมพ์ (บน ICS) มีปุ่มเสร็จสิ้น ฉันต้องการให้ปุ่มเสร็จสิ้นบนแป้นพิมพ์ทริกเกอร์ปุ่มส่งที่ฉันมีในแอปพลิเคชันของฉัน รหัสของฉันมีดังนี้

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


        }
    }

};

}


นั่นหมายถึงการอัปเดตกล่องข้อความ
mpeerman

สิ่งที่ฉันต้องการทำก็คือให้มันทริกเกอร์ปุ่มที่ฉันมีอยู่แล้วด้วย ฉันไม่ต้องการลบปุ่มนี้เพราะบางคนอาจใช้คีย์บอร์ดที่ไม่มีปุ่มเสร็จสิ้น
mpeerman

คำตอบ:


318

คุณสามารถใช้สิ่งนี้ได้เช่นกัน (ตั้งค่าตัวฟังพิเศษที่จะถูกเรียกเมื่อมีการดำเนินการกับ EditText) ซึ่งใช้ได้ทั้งกับ DONE และ 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
ฉันจะตั้งค่าให้ทริกเกอร์การคลิกได้อย่างไรฉันได้วิ่งออกจากปุ่มส่งโมฆะสาธารณะในคลิก (ดูมุมมอง) {
mpeerman

3
คุณสามารถย้ายรหัสทั้งหมดนั้นไปไว้ในฟังก์ชันเดียวแล้วเรียกมันหรือใช้performClick ()
vladexologija

6
สิ่งนี้ไม่ได้ผลสำหรับฉันเมื่อกดปุ่ม DONE KeyEvent เป็นโมฆะเสมอ .. actionId ถูกตั้งค่าเป็น EditorInfo.IME_ACTION_DONE และฉันสามารถใช้สิ่งนั้นแทนได้ (นี่คือใน android 4.2.2 และไม่ตรงกับเอกสาร android sdk ในขณะนี้)
James

28

คุณสามารถลองใช้IME_ACTION_DONE.

การดำเนินการนี้เป็นการดำเนินการ "เสร็จสิ้น" โดยไม่มีการป้อนข้อมูลและ IME จะถูกปิด

 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
อันนี้เหมาะกับฉันมาก ระวังผลตอบแทน TRUE แป้นพิมพ์ยังคงแสดงอยู่ หากคุณต้องการซ่อนแป้นพิมพ์ให้ส่งคืน FALSE
Matwosk

1
ใช้งานได้เหมือนอัญมณี!
sam

16

ลองสิ่งนี้:

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

เมื่อคุณกดปุ่มใด ๆ มุมมองของคุณจะสร้างเหตุการณ์ onKey และเมื่อ keyCode ตรงกับปุ่มขวามันจะทำสิ่งที่คุณต้องการ
Roman Black

1
ปุ่มต้องมีโฟกัส
Jeffrey Blattman

10

โซลูชัน Kotlin

วิธีพื้นฐานในการจัดการกับสิ่งที่ทำใน Kotlin คือ:

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

Kotlin ส่วนขยาย

ใช้เพื่อโทรedittext.onDone {/*action*/}ในรหัสหลักของคุณ ช่วยให้อ่านและบำรุงรักษาได้มากขึ้น

edittext.onDone { submitForm() }

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

อย่าลืมเพิ่มตัวเลือกเหล่านี้ในข้อความแก้ไขของคุณ

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

หากคุณต้องการinputType="textMultiLine"การสนับสนุนโปรดอ่านโพสต์นี้



4

ฉันคัดลอกโค้ดต่อไปนี้จาก AndroidStudio เมื่อคุณสร้าง LoginActivity ฉันใช้คุณสมบัติ ime

ในเค้าโครงของคุณ

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

ในกิจกรรมของคุณ

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

คุณสามารถใช้กับตัวฟังคีย์:

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

ใน 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

หากคุณต้องการจับปุ่ม Enter สำหรับการทำงานของคุณที่คุณต้องการทำผ่านเหตุการณ์ใด ๆ เช่นการคลิกปุ่มคุณสามารถเขียนโค้ดง่ายๆด้านล่างสำหรับมุมมองข้อความนั้น

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

Kotlin และแป้นพิมพ์ตัวเลข

หากคุณใช้แป้นพิมพ์ตัวเลขคุณต้องปิดแป้นพิมพ์จะเป็นดังนี้:

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

ใช้คลาสนี้ในเลย์เอาต์ของคุณ:

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

}

ใน 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
การแสดงความคิดเห็นเกี่ยวกับรหัสของคุณช่วยเพิ่มความสามารถในการอ่านคำตอบได้เสมอ ...
jAC

แม้ว่ารหัสนี้อาจตอบคำถามได้ แต่การให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและ / หรือเหตุผลในการแก้ปัญหาจะช่วยเพิ่มมูลค่าในระยะยาวของคำตอบ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตไม่ใช่แค่คนที่ถามตอนนี้! โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายและระบุข้อ จำกัด และสมมติฐานที่ใช้ นอกจากนี้ยังไม่เจ็บที่จะพูดถึงว่าทำไมคำตอบนี้จึงเหมาะสมกว่าข้ออื่น ๆ
Dev-iL

0

Last Edittext .setOnEditorActionListener ของคุณเรียกเมธอดนี้ว่า hit api อัตโนมัติ

ฉันถูกโทรใน LoginActivity ใน 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;
            }
        });

ทำงานได้ดี


0

และนี่คือเวอร์ชัน Kotlin:

editText.setOnEditorActionListener { v, actionId, event ->
  if(actionId == EditorInfo.IME_ACTION_DONE){
      //Put your action there
      true
  } else {
      false
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.