私は比較的簡単な質問をしました。EditTextがたくさんあるアクティビティがあります。アクティビティを開くと、最初のEditTextが自動的にフォーカスされ、仮想キーボードが表示されます。
どうすればこれを防ぐことができますか?
私は比較的簡単な質問をしました。EditTextがたくさんあるアクティビティがあります。アクティビティを開くと、最初のEditTextが自動的にフォーカスされ、仮想キーボードが表示されます。
どうすればこれを防ぐことができますか?
回答:
XMLファイルのレイアウトタグでこの属性を使用します。
android:focusable="true"
android:focusableInTouchMode="true"
コメントで他のメンバーによって報告されているように機能しないScrollView
ため、これらの属性をのメインの子に追加する必要がありますScrollView
。
これをAndroidマニフェストアクティビティに追加できます。
android:windowSoftInputMode="stateHidden|adjustResize"
android:windowSoftInputMode="stateHidden|adjustPan"
ここで説明するいくつかの実装がありますが、今度AndroidManifest.xml
は私Activity
のプロパティに追加しました:
android:windowSoftInputMode="stateAlwaysHidden"
fragments
。" stateAlwaysHidden "アクティビティのメインウィンドウに入力フォーカスがある場合、ソフトキーボードは常に非表示になります。
https://stackoverflow.com/a/11627976/5217837これはほぼ正しいです:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
ただし、SOFT_INPUT_STATE_ALWAYS_VISIBLEではなくSOFT_INPUT_STATE_HIDDENにする必要があります。
あなたの活動のコードでこれを使用してください:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
Android 3.2.1をタブレットで使用すると、タブを切り替えるとキーボードが自動的にポップアップして表示されたままでも、同様の問題が発生しました。次の方法を使用します。
public void setEditTextFocus(EditText searchEditText, boolean isFocused)
{
searchEditText.setCursorVisible(isFocused);
searchEditText.setFocusable(isFocused);
searchEditText.setFocusableInTouchMode(isFocused);
if (isFocused) {
searchEditText.requestFocus();
} else {
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS );
}
}
各EditTextのアクティビティのonCreate()およびonPause()で:
setEditTextFocus(myEditText、false);
各EditTextとOnTouchListenerについて:
myEditText.setOnTouchListener(new EditText.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
setEditTextFocus(myEditText, true);
return false;
}
});
それぞれのためEditText
にありますOnEditorActionListener
:
myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
.......
setEditTextFocus(myEditText, false);
return false;
}
});
そして、それぞれEditText
のlayout xml
:
android:imeOptions="actionDone"
android:inputType="numberDecimal|numberSigned" // Or something else
おそらくもっと多くのコード最適化が可能です。
私のために機能するこの簡単な解決策を見つけました。これらの属性を親レイアウトに設定します:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >
そして今、アクティビティが開始すると、このメインレイアウトがデフォルトでフォーカスされます。
また、次のように、メインレイアウトに再度フォーカスを与えることで、実行時に子ビューからフォーカスを削除できます。
findViewById(R.id.mainLayout).requestFocus();
それがあなたのために働くことを願っています。
これは私が使用しているソリューションであり、最良のソリューションではありませんが、私にとってはうまく機能しています
editComment.setFocusableInTouchMode(false);
editComment.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event)
{
// TODO Auto-generated method stub
editComment.setFocusableInTouchMode(true);
editComment.requestFocus() ;
return false;
}});
興味深いことに、このドキュメントhttps://developer.android.com/training/keyboard-input/visibility.htmlは、アクティビティが開始されてフォーカスがテキストフィールドに与えられたときに、ソフトキーボードが表示されない(その後、コードを使用する場合は、キーボードを表示する方法を示します)。
私のSamsung Galaxy S5では、これが私のアプリ(マニフェストエントリまたは特定のコードなし)の動作方法です-ソフトキーボードはありません。ただし、Lollipop AVDでは、ソフトキーボードが表示され、上記のドキュメントに反します。
AVDでテストするときにこの動作が発生する場合は、実際のデバイスでテストして、何が起こるかを確認することができます。
これは、次の投稿でいくつかの良い答えがあります。EditTextがActivityの起動時にフォーカスを取得しないようにします。私が定期的に使用しているのは、Morganによる次のコードです。
<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px"/>
<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:nextFocusUp="@id/autotext"
android:nextFocusLeft="@id/autotext"/>
注:ダミーアイテムは、フォーカス可能な要素の前に右に配置する必要があります。
ScrollViewでも完全に機能し、アクセシビリティについても問題はなかったと思います。
受け入れられた答えは私にとってはうまくいっていません、それが答えを与える解決策の理由です、それが役に立つかもしれません!
EditText edt = (EditText) findViewById(R.id.edt);
edt.requestFocus();
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
キーボードが開いています。
android:windowSoftInputMode = "stateHidden | adjustResize"
正常に動作しています
android:focusableInTouchMode="true"
XMLに上記の行を追加しEditText
たりTextInputLayout
、フォーカスを持っているし、原因となっていますsoftInputKeyboard
がポップアップします。
これで問題が解決し、キーボードがポップアップしなくなりました
search_edit_text =(EditText)findViewById(R.id.search_edit_text);
search_edit_text.requestFocus();
search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
これは私のために動作しますフラグメントはいくつかの異なる構文を持っているかもしれません。これは活動のために働く
ビューにEditTextとListviewがある場合、デフォルトでキーボードが開きます。デフォルトでキーボードのポップアップを非表示にするには、次のようにします
this.listView.requestFocus();
editTextのビューを取得した後、リストビューへのフォーカスを要求していることを確認してください。
例えば
this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();
そうすると、editTextにフォーカスが移り、キーボードがポップアップします。