在我的应用中,我有一个字段供用户输入数字。我将字段设置为仅接受数字。当用户点击该字段时,它会调出键盘。在键盘上(在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);
}
}
};
}
答案 0 :(得分:285)
你也可以使用这个(设置一个特殊的监听器,当在EditText上执行一个动作时被调用),它既适用于DONE又适用于RETURN:
max.setOnEditorActionListener(new 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");
}
return false;
}
});
答案 1 :(得分:17)
您可以尝试使用IME_ACTION_DONE
。
此操作执行“完成”操作,无需输入和输入 IME将被关闭。
Exception: Thrown from class C
at seabird.test.C.exc(index.php:78)
at seabird.test.C.doexc(index.php:70)
at seabird.test.fail2(index.php:85)
at seabird.test.fail1(index.php:89)
at (main)(index.php:93)
Caused by: Exception: Thrown from class B
at seabird.test.B.exc(index.php:64)
at seabird.test.C.exc(index.php:75)
... 4 more
Caused by: Exception: Thrown from class A
at seabird.test.A.exc(index.php:46)
at seabird.test.B.exc(index.php:61)
... 5 more
答案 2 :(得分:16)
试试这个:
max.setOnKeyListener(new OnKeyListener(){
@Override
public boolean onKey(View v, int keyCode, KeyEvent event){
if(keyCode == event.KEYCODE_ENTER){
//do what you want
}
}
});
答案 3 :(得分:12)
在Kotlin中处理已完成操作的基本方法是:
edittext.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
// Call your code here
true
}
false
}
使用它在您的主代码中调用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"
支持,请read this post
答案 4 :(得分:8)
尝试使用Xamarin.Android(跨平台)
edittext.EditorAction += (object sender, TextView.EditorActionEventArgs e) {
if (e.ActionId.Equals (global::Android.Views.InputMethods.ImeAction.Done)) {
//TODO Something
}
};
答案 5 :(得分:4)
我在创建LoginActivity时从AndroidStudio复制了以下代码。 我使用了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;
}
});
答案 6 :(得分:2)
您可以在密钥监听器上实现:
public class ProbabilityActivity extends Activity implements OnClickListener, View.OnKeyListener {
on 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;
}
答案 7 :(得分:1)
如果您想通过任何事件(例如单击按钮)来捕获键盘输入按钮来完成您的工作,则可以为该文本视图编写以下简单代码
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;
}
});
答案 8 :(得分:1)
科特林键盘和数字键盘
如果您使用数字键盘,则必须关闭键盘, 就像这样:
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
}
}
答案 9 :(得分: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" />
答案 10 :(得分:0)
max.setOnKeyListener(new OnKeyListener(){
@Override
public boolean onKey(View v, int keyCode, KeyEvent event){
if(keyCode == event.KEYCODE_ENTER){
//do what you want
}
}
});
答案 11 :(得分:0)
你的上一个Edittext .setOnEditorActionListener调用此方法自动命中api
我在et_password中的LoginActivity中调用
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;
}
});
工作正常
答案 12 :(得分:0)
这是Kotlin版本:
editText.setOnEditorActionListener { v, actionId, event ->
if(actionId == EditorInfo.IME_ACTION_DONE){
//Put your action there
true
} else {
false
}
}