自动popup键盘启动Activity
我有一个相对简单的问题。 我有一个有很多EditText的活动。 当我打开该活动时,它会自动聚焦到第一个EditText并显示虚拟键盘。
我怎样才能防止这个?
在XML文件的layout标签中使用这个属性:
android:focusable="true" android:focusableInTouchMode="true"
正如其他成员在注释中所报告的那样,它在ScrollView
上不起作用,因此您需要将这些属性添加到ScrollView
。
您可以将其添加到您的Android Manifest活动中:
android:windowSoftInputMode="stateHidden|adjustResize"
我在这里有几个实现,但现在我已经添加到AndroidManifest.xml
为我的Activity
的属性:
android:windowSoftInputMode="stateAlwaysHidden"
即使你正在使用fragments
我认为这是简单的方法。
“ stateAlwaysHidden ”当活动的主窗口具有input焦点时,软键盘始终处于隐藏状态。
如果你有像ListView
一样的活动的另一个视图,你也可以这样做:
ListView.requestFocus();
在你的onResume()从editText
抓取焦点。
我知道这个问题已经回答,但只是提供了替代解决scheme,为我工作:)
https://stackoverflow.com/a/11627976/5217837这几乎是正确的:;
@Override public void onCreate(Bundle savedInstanceState) { getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); }
但它应该是SOFT_INPUT_STATE_HIDDEN而不是SOFT_INPUT_STATE_ALWAYS_VISIBLE
在你的Activity的代码中使用这个:
@Override public void onCreate(Bundle savedInstanceState) { getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); }
我有一个类似的问题,即使在切换标签时,键盘自动popup并停留在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的activity的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; } });
对于OnEditorActionListener
每个EditText
:
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
可能有更多的代码优化可能。
我发现这个简单的解决scheme,为我工作。设置这些属性在你的父级布局:
<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();
希望它能为你工作。
这是我使用的解决scheme,不是最好的解决scheme,但它对我来说很好
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; }});
在我的三星Galaxy S5,这是我的应用程序(没有清单条目或特定的代码)如何工作 – 没有软键盘。 然而,在一个棒棒糖AVD,一个软键盘显示 – 违反了上述文件。
如果在AVD中进行testing时出现这种情况,您可能需要在真实的设备上进行testing以了解所发生的情况。
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);
在下面的文章中有一些很好的答案: 停止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它也应该可以正常工作,而且对于这个function也没有什么问题。
这发生在您的EditText自动获取焦点时,因为您的活动开始。 所以一个简单而稳定的方法来解决这个问题,就是把初始焦点设置成任何其他的视图,比如一个Button等等。
你可以在你的布局XML中做到这一点,不需要代码
接受的答案不适合我,这就是为什么给答案工作的解决scheme,可能是有帮助的!
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));
现在键盘是开放的享受:)
如果你的视图有EditText和Listview,那么Keyboard会默认打开。 要隐藏键盘popup默认情况下执行以下操作
this.listView.requestFocus();
确保您在获取editText的查看后请求关注listview。
例如
this.listView = (ListView) this.findViewById(R.id.list); this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch); this.listView.requestFocus();
如果你这样做,那么editText将获得焦点和键盘将popup。