比較的簡単な質問がありました。私は多くのEditTextがそれらにあるアクティビティを持っています。アクティビティを開くと、最初のEditTextに自動的にフォーカスされ、仮想キーボードが表示されます。
どうすればこれを防ぐことができますか?
XMLファイルのレイアウトタグで次の属性を使用します。
Android:focusable="true"
Android:focusableInTouchMode="true"
他のメンバーがコメントで報告しているように、それはScrollView
では機能しないため、これらの属性をScrollView
のメインの子に追加する必要があります。
これをAndroidマニフェストアクティビティに追加できます。
Android:windowSoftInputMode="stateHidden|adjustResize"
ここでいくつかの実装を説明しましたが、今ではActivity
プロパティのAndroidManifest.xml
に追加しています:
Android:windowSoftInputMode="stateAlwaysHidden"
fragments
を使用している場合でも、これは簡単な方法だと思います。"stateAlwaysHidden"アクティビティのメインウィンドウに入力フォーカスがある場合、ソフトキーボードは常に非表示になります。
ListView
など、アクティビティに関する別のビューがある場合は、次のこともできます。
ListView.requestFocus();
onResume()でeditText
からフォーカスを取得します。
私はこの質問に答えていることを知っていますが、私のために働いた代替ソリューションを提供するだけです:)
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;
}
});
そして、layout xml
のEditText
ごとに:
Android:imeOptions="actionDone"
Android:inputType="numberDecimal|numberSigned" // Or something else
おそらくより多くのコード最適化が可能です。
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);
私のために働いたこの簡単な解決策を見つけました。あなたの親レイアウトでこれらの属性を設定してください:
<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();
それがあなたのために働くことを願っています。
興味深いことに、このドキュメント https://developer.Android.com/training/keyboard-input/visibility.html は、アクティビティが開始され、テキストフィールドにフォーカスが与えられたとき、ソフトキーボードは表示されます(さらに、コードを使用する場合にキーボードを表示する方法を示します)。
私のSamsung Galaxy S5では、これが私のアプリ(マニフェストエントリまたは特定のコードなし)の仕組みです-ソフトキーボードはありません。ただし、Lollipop AVDでは、上記のドキュメントに反して、ソフトキーボードが表示されます。
AVDでテストするときにこの動作が発生する場合は、実際のデバイスでテストして、何が起こるかを確認してください。
これには、次の投稿でいくつかの良い答えがあります。 Activityの起動時にEditTextがフォーカスを取得しないようにする 。私が定期的に使用しているのは、 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でも完璧に機能するはずであり、アクセシビリティに関しても問題はなかったと思います。
これは私が使用しているソリューションであり、最良のソリューションではありませんが、私にとってはうまく機能しています
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;
}});
Android:windowSoftInputMode = "stateHidden | adjustResize"
正常に動作しています
受け入れられた答えは私のために機能していませんだから答えが機能する解決策を与えてください、それは役に立つかもしれません!
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));
キーボードが開いています。
以下のコードをアクティビティXMLの先頭に追加し、ビューがEditTextの上にあることを確認します
<View
Android:layout_width="0dp"
Android:layout_height="0dp"
Android:focusableInTouchMode="true"/>
Android:focusableInTouchMode="true"
上記の行をEditText
またはTextInputLayout
のxmlに追加します。これらはフォーカスを持ち、softInputKeyboard
をポップアップさせます。
これで問題が解決し、キーボードがポップアップしなくなりました
これは、アクティビティの開始時にEditTextが自動的にフォーカスを取得したときに発生します。そのため、これを修正する簡単で安定した方法の1つは、ボタンなどの他のビューに初期フォーカスを設定することです。
レイアウトXMLでこれを行うことができ、コードは不要です。