我有一个相对简单的问题。我有一个包含很多EditText的活动。当我打开活动时,它会自动聚焦到第一个EditText并显示虚拟键盘。
我该如何预防?
我有一个相对简单的问题。我有一个包含很多EditText的活动。当我打开活动时,它会自动聚焦到第一个EditText并显示虚拟键盘。
我该如何预防?
Answers:
在XML文件的布局标记中使用以下属性:
android:focusable="true"
android:focusableInTouchMode="true"
正如其他成员在评论中所报告的那样,该功能无效,ScrollView
因此您需要将这些属性添加到的主要子级中ScrollView
。
我在这里描述了几种实现,但是现在我已经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_HIDDEN,而不是SOFT_INPUT_STATE_ALWAYS_VISIBLE
在您的活动代码中使用此代码:
@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
可能还有更多的代码优化可能。
((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();
希望它对你有用。
这是我正在使用的解决方案,不是最好的解决方案,但对我来说效果很好
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:focusableInTouchMode="true"
将以上一行添加到EditText
或TextInputLayout
具有焦点并导致softInputKeyboard
弹出的xml中。
这为我们解决了问题,现在键盘没有弹出
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的视图后请求将焦点集中在listview上。
例如
this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();
如果这样做,则editText将获得焦点,并且键盘将弹出。