Android対応"を入力"をEditText
-
18-09-2019 - |
質問
んかがある場合を扱う時に、ユーザーを押し 入 をタイピングに EditText
, のようなものonSubmitのHTMLイベントです。
も疑問がある場合に操作する仮想キーボードなどの"Done"ボタンは変更される場合がありますので何か(例えば"行き"を行う一定時にアクションをクリックすもののようにonSubmit).
解決
私の場合は を取り扱うユーザーを押し 入 ながら タイピングにEditTextのようなもの のonSubmitのHTMLイベントです。
そうです。
ものがあって迷う を操作する仮想キーボード この"Done"ボタンを 標識したうえ "行き"を行う一定の行動 クリックすると再度、onSubmit).
もあります。
眺めてみると良いでしょに android:imeActionId
や android:imeOptions
属性プラスの setOnEditorActionListener()
方法、すべて TextView
.
の変更テキストの"Done"ボタンをカスタム文字列使用します:
mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);
他のヒント
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;
}
});
ここにあなたが何をすべきかです。また、Androidの開発者のサンプルコード「ブルートゥースチャット」に隠されています。独自の変数やメソッドを持つのの「例」と言う大胆なパーツを交換します。
まず、あなたは戻るボタンが特別な何かをしたい主な活動に必要なものをインポートします:
import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import android.view.KeyEvent;
さて、あなたのリターンキーをタイプTextView.OnEditorActionListenerの変数を作る(のexampleListenerここで私が使用しての);
TextView.OnEditorActionListener exampleListener = new TextView.OnEditorActionListener(){
次に、あなたがリスナーに戻るボタンを押したときに何をすべきかについての二つのことを伝える必要があります。それは(ここで私はのexampleView を使用)私たちが何を言ってるのかのEditText知っている必要がありますし、Enterキーが(ここでは、をexample_confirm()<押したとき、それは何をすべきかを知っておく必要があります/強いです>)。これはあなたの活動の最後または唯一のEditTextであれば、それはあなたの提出(またはOK、確認して、送信、保存、など)、ボタンのonclickメソッドと同じことを行う必要があります。
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;
}
最後に、(あなたのonCreateメソッドの中で最も可能性の高い)リスナーを設定します。
exampleView.setOnEditorActionListener(exampleListener);
ハードウェアキーボードも収入のイベントが、ソフトウェアキーボードの異なるactionIDs、nullにsingleLine EditTexts.このコード対応の全てのユーザーのプレスを記入EditTextこのリスナーに設定されていくEditTextまたはキーボードタイプです。
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
}
};
デフォルトの外観を入力キー singleLine=falseを曲がった矢印の入っています。時singleLine=trueのEditTextの鍵は、やはEditTextsでいます。デフォルトでは、この行動はすべてのバニラ、android、googleのエミュレータ.のscrollHorizontal属しない。場合は、nullの試験は重要で、応答の携帯電話をソフト入りのメーカーでのエミュレータ、バニラのレベルの16のエミュレータに対応長ソフト入りマルチラインとscrollHorizontal EditTextsとactionId次およびnullのイベントです。
私は、これは歳ですけど、私はただ、これはのEditTextのために完璧に動作を発見します。
EditText textin = (EditText) findViewById(R.id.editText1);
textin.setInputType(InputType.TYPE_CLASS_TEXT);
これは、テキストとスペース以外のものを防ぐことができます。私はタブ、 "リターン"( "\ n")を、または何もできませんでした。
このページに記述するかではないかと思います。
https://developer.android.com/training/keyboard-input/style.html
の設定 android:imeOptions そしてあなただけの確認 actionId にonEditorAction.で設定した場合imeOptionsをactionDoneしいチェックactionId==EditorInfo.IME_ACTION_DONE"のonEditorAction.また、設定してくださいandroid:inputType.
こちらEditTextの例ではリンク先:
<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" />
ように設定することもできますこのプログラムを使用 setImeOptions(int) 機能です。こちらOnEditorActionListenerからの例は、リンク先:
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;
}
});
ただ、(私のためにほぼ完全に働いていた)チャドの応答に付録として、私は一度、キーアップ時に、一度に(2回実行される私のコードを防ぐためにKeyEventのアクションタイプのチェックを追加するために必要なことがわかりましたキーダウンイベント)。
if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN)
{
// your code here
}
私は、同様の目的を持っていました。私はのTextViewを拡張AutoCompleteTextViewに(私はカスタマイズしたかった)、キーボードの「Enter」キーを押す解決したかったです。私は上からさまざまなソリューションを試してみましたが、彼らが動作するように見えました。代わりに、リスナーからの私のコードを処理する、新しい行があった場所、私は(標準のAndroidキーボードに(それは完全に働いた)SwiftKey 3からの私のデバイス(AOKP ROMとネクサス4)上の入力タイプを切り替えたときに、私はいくつかの問題を経験しました「Enter」キーを押した後に入力された。それは、この問題を処理するために、私はしばらく時間がかかったが、それはすべての状況の下で使用する入力タイプに関係なく動作するかどうかはわからない。
だからここに私のソリューションです:
「テキスト」にXMLでのTextViewの入力タイプの属性を設定します:
android:inputType="text"
キーボードの「Enter」キーのラベルをカスタマイズします:
myTextView.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);
のTextViewにOnEditorActionListenerを設定します:
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;
}
});
私は、彼らはほとんど私にナットを運転したので、これは、私が持っていた問題を回避するために他人を助けることができると思います。
あなたのXMLでは、EDITTEXTにimeOptions属性を追加します。
<EditText
android:id="@+id/edittext_additem"
...
android:imeOptions="actionDone"
/>
次に、Javaコードでは、同じのEditTextにOnEditorActionListenerを追加します。
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;
}
});
ここでexplanation-です imeOptions = actionDoneはEnterKeyをする "actionDone" を割り当てます。キーボードでEnterKeyをは「完了」に「入力」から変更されます。 Enterキーが押されたときにそう、それはこのアクションをトリガーするため、あなたがそれを処理します。
あなたもそれを行うことができます..
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;
}
});
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;
}
});
は、私にとって非常に細かい作品
また、非表示のキーボードで
に完全に取り組ん
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");
}
});
}
}
に完全に取り組ん
まず、あなたがキーを押しに耳を傾けるのEditTextを設定する必要があります。
@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);
}
第二に、キーを押す時にイベントを定義し、例えば、イベントは、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;
}
そして最後に、一番上にあるのEditText、TextViewに、OnKeyListener、たKeyEventをインポートすることを忘れないでください。
import android.view.KeyEvent;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;
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" />
これは動作するはずです。
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!");
}
}
});
これはLGのAndroid携帯電話上で正常に動作します。これは、通常の文字として解釈されるENTER
およびその他の特殊文字を防ぐことができます。 Next
またはDone
ボタンが自動的に表示され、ENTER
が期待通りに動作します。
edit.setInputType(InputType.TYPE_CLASS_TEXT);
ここでは、あなたのUtils
や、ユーザーがハードウェアまたはソフトウェアキーボードのリターンキーを打つ時にコードを実行しますKeyboards
クラスに投げることができる単純な静的機能です。それは、@の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;
}
};
}
テキストフィールドのInputTypeはCommonsWareが動作するように言ったためにtext
しなければなりません。ただ、このすべてを試みたが、裁判と何が働いていないinputType前に、入力としてソフト登録まま入力します。 inputType = text
後、setImeLabel含めてすべてが働いています。
の例のandroid:inputType="text"
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;
}
});
それは必要なモジュールをインポートできるように、あなたのエディタでこのコードを入力します。
query.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
if(actionId == EditorInfo.IME_ACTION_DONE
|| actionId == EditorInfo.IME_ACTION_DONE
|| keyEvent.getAction() == KeyEvent.ACTION_DOWN
|| keyEvent.getAction() == KeyEvent.KEYCODE_ENTER) {
// Put your function here ---!
return true;
}
return false;
}
});
頼に対応する <enter> にEditTextで TextWatcher, は、 LocalBroadcastManager, では、 BroadcastReceiver.新規に追加することで対応が可能 v4支援ライブラリ 利用LocalBroadcastManager.使えるチュートリアルで vogella.com:7.3"地方放送イベントLocalBroadcastManager"が完全に簡潔なコード例です。にonTextChanged 前 は のインデックスの変更 変更前>;マイナスが始まります。時にTextWatcherのUIのスレッドが忙しく更新editTextの編集が可能、お送りする意図で"覚BroadcastReceiverが、UIのスレッドは更新editText.
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
これらdepencendyを追加し、それが動作するはずます:
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
この問いの回答いButterknife
レイアウトの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>
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;
}
Kotlin
editTextVar?.setOnKeyListener { v, keyCode, event ->
if((event.action == KeyEvent.ACTION_DOWN)
&& (event.keyCode == KeyEvent.KEYCODE_ENTER)){
//Do something, such as loadJob()
loadJob()
return@setOnKeyListener true
}
false
}