问题:
I want to hide the keyboard when the button "Add" is pressed. There are two
EditText
on the screen. The keyboard doesn't appear at starting the activity, which is good, but it doesn't go away on clicking button.
以下是我从 Stack Overflow 中看到的所有可能的问题,但这些问题的答案对我没有帮助:
Close/hide the Android Soft Keyboard
Programmatically Hide/Show Android Soft Keyboard
How to hide Soft Keyboard when activity starts
How to hide soft keyboard on android after clicking outside EditText?
和许多其他人。
这是我的代码:
添加 Activity
public class AddActivity extends ActionBarActivity {
EditText text1,text2;
DbHelper db;
ListView l;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
db = new DbHelper(this);
l = (ListView) findViewById(R.id.listInAddActivity);
text1 = (EditText) findViewById(R.id.i1);
text2 = (EditText) findViewById(R.id.i2);
// text1.setInputType(InputType.TYPE_NULL);
// text2.setInputType(InputType.TYPE_NULL);
hideKeyboard();
loadDataInAdd();
}
public void addNewTask(View view) {
String s1 = text1.getText().toString();
String s2 = text2.getText().toString();
db.addData(s1,s2);
loadDataInAdd();
hideKeyboard();
}
public void loadDataInAdd()
{
try {
Cursor cursor = db.fetchData();
ListAdapter myAdapter = new SimpleCursorAdapter(this, R.layout.tasks,
cursor,
new String[]{db._ID, db.COLUMN_1, db.COLUMN_2},
new int[]{R.id.idnum, R.id.c1, R.id.c2}, 0);
l.setAdapter(myAdapter);
}
catch(NullPointerException e)
{
e.printStackTrace();
}
// MainActivity.loadData();
}
private void hideKeyboard() {
// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
大多数答案都是关于 InputManager
方法的,但它对我不起作用,即单击按钮时不会隐藏键盘。这是我使用的 InputManager
的另一种变体:
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
我也试过这个:
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);
这也不起作用(键盘不会在点击按钮时隐藏)。
我也试过:
<activity android:name=".AddActivity"
android:label="@string/app_name"
android:parentActivityName=".MainActivity"
android:windowSoftInputMode="stateAlwaysHidden">
</activity>
和
<activity android:name=".AddActivity"
android:label="@string/app_name"
android:parentActivityName=".MainActivity"
android:windowSoftInputMode="stateAlwaysHidden">
</activity>
有了这个,我的应用停止工作了:
InputMethodManager inputManager = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
这个完全隐藏了键盘(即使点击 editText
键盘也没有出现):
text1.setInputType(InputType.TYPE_NULL);
text2.setInputType(InputType.TYPE_NULL);
最佳答案
我决定为我的按钮使用一个 onclicklistener
,而不是使用另一个函数并通过 AddActivity.xml
中的 onClick
调用它。
当我决定再次尝试使用 OnCliCkListener
时,我的问题已进行到一半。经过几次随机尝试,以下是适合我的最终代码:
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
});
另一种方法是按以下方式使用 OnClickListener
:
private View.OnClickListener mListener = new View.OnClickListener() {
public void onClick(View v) {
// do something when the button is clicked
//public void onClick(View v) {
try {
InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
catch (Exception e) {
e.printStackTrace();
}
}
};
对于像我这样的初学者的要点:
- 以上代码应该放在
protected void onCreate(Bundle savedInstanceState)
之前
要调用上面的代码,请将此代码放在
protected void onCreate(Bundle savedInstanceState)
中:btn.setOnClickListener(mListener);
在两种方法(
onClickListener
、setOnClickListener
)中使用try-catch
进行异常处理
在搜索为什么 onClick
时,XML
属性对我不起作用,而 OnClickListener
对我起作用,我找到了以下链接有用:
setOnclickListener vs OnClickListener vs View.OnClickListener
Android onClick in XML vs. OnClickListener
How exactly does the android:onClick XML attribute differ from setOnClickListener?
Difference between OnClick() event and OnClickListener?
现在,在我的回答进行到一半时,我意识到我在使用 XML 中的 onClick
时犯了错误。以下是我为摆脱 OnClickListener
所做的工作:
- 首先,我将隐藏键盘的代码部分移到了
onClick
的方法中。在我的例子中,我将hideKeyboard()
中的整个代码移到了addNewTask
中。
关于使用onClick
的一些要点
该方法应该是
public
和void
。它应该带一个
View
参数,例如View V
。
最后,有效的代码:
public void addNewTask(View view) {
String s1 = text1.getText().toString();
String s2 = text2.getText().toString();
db.addData(s1, s2);
loadDataInAdd();
// hideKeyboard(); below is the code to hide keyboard
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
总结
我找到了 3 种隐藏软键盘的方法,使用:
点击监听器:
private View.OnClickListener mListener = new View.OnClickListener() { public void onClick(View v) { // do something when the button is clicked //public void onClick(View v) { try { InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); } catch (Exception e) { e.printStackTrace(); } } };
设置点击监听器:
btn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); } });
onClick,
XML
属性:public void addNewTask(View view) { String s1 = text1.getText().toString(); String s2 = text2.getText().toString(); db.addData(s1, s2); loadDataInAdd(); // hideKeyboard(); if (view != null) { InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0); } }
关于android - 即使使用输入管理器也无法隐藏 Android 软键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31337306/