自动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; }}); 

有趣的是,这个文档https://developer.android.com/training/keyboard-input/visibility.html指出,当一个活动开始时,焦点被赋予一个文本字段,软键盘不显示(然后继续告诉你如何使用代码来显示键盘)。;

在我的三星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。