Ok w mojej aplikacji mam pole do wpisania liczby przez użytkownika. Mam ustawione pole, aby akceptować tylko liczby. Kiedy użytkownik kliknie to pole, wyświetla klawiaturę. Na klawiaturze (na ICS) znajduje się przycisk gotowe. Chciałbym, aby przycisk Gotowe na klawiaturze uruchamiał przycisk przesyłania, który mam w mojej aplikacji. Mój kod jest następujący.
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);
}
}
};
}
android
keyboard-events
android-softkeyboard
mpeerman
źródło
źródło
Odpowiedzi:
Możesz również użyć tego (ustawia specjalny detektor, który ma być wywoływany, gdy akcja jest wykonywana na EditText), działa zarówno dla DONE, jak i 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; } });
źródło
Możesz spróbować
IME_ACTION_DONE
.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; } });
źródło
Spróbuj tego:
max.setOnKeyListener(new OnKeyListener(){ @Override public boolean onKey(View v, int keyCode, KeyEvent event){ if(keyCode == event.KEYCODE_ENTER){ //do what you want } } });
źródło
Rozwiązanie Kotlin
Podstawowy sposób obsługi wykonanej akcji w Kotlinie to:
edittext.setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_DONE) { // Call your code here true } false }
Rozszerzenie Kotlin
Użyj tego, aby wywołać
edittext.onDone {/*action*/}
swój główny kod. Sprawia, że jest bardziej czytelny i łatwy w utrzymaniuedittext.onDone { submitForm() } fun EditText.onDone(callback: () -> Unit) { setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_DONE) { callback.invoke() true } false } }
Nie zapomnij dodać tych opcji do swojego pliku edittext
<EditText ... android:imeOptions="actionDone" android:inputType="text"/>
źródło
Wypróbuj to dla platformy Xamarin.Android (między platformami)
edittext.EditorAction += (object sender, TextView.EditorActionEventArgs e) { if (e.ActionId.Equals (global::Android.Views.InputMethods.ImeAction.Done)) { //TODO Something } };
źródło
Skopiowałem następujący kod z AndroidStudio podczas tworzenia LoginActivity. Używam atrybutów ime
W twoim układzie
<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"/>
W Twojej aktywności
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; } });
źródło
Możesz zaimplementować na key listener:
public class ProbabilityActivity extends Activity implements OnClickListener, View.OnKeyListener {
W 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; }
źródło
jeśli chcesz złapać klawisz Enter na klawiaturze, aby wykonać swoją pracę, którą chcesz wykonać za pomocą dowolnego zdarzenia, takiego jak kliknięcie przycisku, możesz napisać poniższy prosty kod dla tego widoku tekstu
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; } });
źródło
Kotlin i klawiatura numeryczna
Jeśli używasz klawiatury numerycznej, musisz odrzucić klawiaturę, będzie to wyglądać następująco:
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 } }
źródło
Użyj tej klasy w swoim układzie:
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; }
}
W 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" />
źródło
max.setOnKeyListener(new OnKeyListener(){ @Override public boolean onKey(View v, int keyCode, KeyEvent event){ if(keyCode == event.KEYCODE_ENTER){ //do what you want } } });
źródło
Twój Last Edittext .setOnEditorActionListener wywołuje tę metodę automatycznego hit api
Byłem Call in LoginActivity w 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; } });
Pracować w porządku
źródło
A to jest wersja Kotlin:
editText.setOnEditorActionListener { v, actionId, event -> if(actionId == EditorInfo.IME_ACTION_DONE){ //Put your action there true } else { false } }
źródło