在 android 中输入 EditText 后如何隐藏键盘?

我有一个 EditText和按钮对准父母的底部。

当我在其中输入文本并按下按钮保存数据时,虚拟键盘并没有消失。

谁能教我怎么把键盘藏起来?

173035 次浏览

这个应该可以。

InputMethodManager inputManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);

只要确保 this. getCurrentFocus ()不返回 null,如果没有焦点,它就会返回 null。

过去几天我一直在努力找到了一个非常有效的解决方案。当在 EditText 之外的任何地方触摸时,软键盘将被隐藏。

代码张贴在这里: 隐藏默认键盘点击安卓

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

您可能还希望在 EditText 中定义 imeOptions。这样,一旦你按下完成键,键盘就会消失:

<EditText
android:id="@+id/editText1"
android:inputType="text"
android:imeOptions="actionDone"/>

EditText 动作监听器中包含的解决方案:

public void onCreate(Bundle savedInstanceState) {
...
...
edittext = (EditText) findViewById(R.id.EditText01);
edittext.setOnEditorActionListener(new OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (event != null&& (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
in.hideSoftInputFromWindow(edittext.getApplicationWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
}
return false;
}
});
...
...
}

我使用这个方法从编辑文本中删除键盘:

 public static void hideKeyboard(Activity activity, IBinder binder) {
if (activity != null) {
InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
if (binder != null && inputManager != null) {
inputManager.hideSoftInputFromWindow(binder, 0);//HIDE_NOT_ALWAYS
inputManager.showSoftInputFromInputMethod(binder, 0);
}
}
}

并且这种方法可以把键盘从活动中移除(在某些情况下不起作用——例如,当编辑文本时,对其进行键盘绑定,失去焦点,就不起作用了。但是对于其他情况,它工作得很好,而且您不必关心支持键盘的元素)。

 public static void hideKeyboard(Activity activity) {
if (activity != null) {
InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
if (activity.getCurrentFocus() != null && inputManager != null) {
inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
inputManager.showSoftInputFromInputMethod(activity.getCurrentFocus().getWindowToken(), 0);
}
}
}
editText.setInputType(InputType.TYPE_NULL);
   mEtNumber.setOnEditorActionListener(new TextView.OnEditorActionListener() {


@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
// do something, e.g. set your TextView here via .setText()
InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
return true;
}
return false;
}
});

并且在 xml 中

  android:imeOptions="actionDone"

你可以在上面看到有标记的答案。但是我使用 getDialog().getCurrentFocus()并且工作得很好。我张贴这个答案,因为我不能键入 "this"在我的 oncreate 对话框。

所以这就是我的答案。如果你试过标记答案,但没有成功,你可以简单地试试这个:

InputMethodManager inputManager = (InputMethodManager) getActivity().getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getDialog().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

我没有看到任何人使用这种方法:

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean focused) {
InputMethodManager keyboard = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
if (focused)
keyboard.showSoftInput(editText, 0);
else
keyboard.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
});

然后请求将焦点集中到 edit 文本:

editText.requestFocus();
int klavStat = 1; // for keyboard soft/hide button
int inType;  // to remeber your default keybort Type

Editor-是 EditText 字段

/// metod for onclick button ///
public void keyboard(View view) {
if (klavStat == 1) {
klavStat = 0;
        

inType = editor.getInputType();
        

InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
     



editor.setInputType(InputType.TYPE_NULL);


editor.setTextIsSelectable(true);
} else {
klavStat = 1;




InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);


imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);


editor.setInputType(inType);
}
}

如果您有另一个 EditText 字段,则需要注意焦点的更改。

我发现这个是因为我的 EditText 没有在进入时自动被解雇。

这是我的原始密码。

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if ( (actionId == EditorInfo.IME_ACTION_DONE) || ((event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN ))) {


// Do stuff when user presses enter


return true;


}


return false;
}
});

我通过移除管道解决了这个问题

return true;

当用户按下输入键时,在做完事情之后。

希望这对谁有帮助。

您可以像下面这样轻松地为调用创建一个单例类:

public class KeyboardUtils {


private static KeyboardUtils instance;
private InputMethodManager inputMethodManager;


private KeyboardUtils() {
}


public static KeyboardUtils getInstance() {
if (instance == null)
instance = new KeyboardUtils();
return instance;
}


private InputMethodManager getInputMethodManager() {
if (inputMethodManager == null)
inputMethodManager = (InputMethodManager) Application.getInstance().getSystemService(Activity.INPUT_METHOD_SERVICE);
return inputMethodManager;
}


@SuppressWarnings("ConstantConditions")
public void hide(final Activity activity) {
new Handler().post(new Runnable() {
@Override
public void run() {
try {
getInputMethodManager().hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
} catch (NullPointerException e) {
e.printStackTrace();
}
}
});
}
}

所以,在可以调用活动后下一个表格如何:

public class MainActivity extends AppCompatActivity {


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
KeyboardUtils.getInstance().hide(this);
}


}

只需写下这两行代码,其中 Enter 选项将起作用。

InputMethodManager inputManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);

在我的例子中,为了在按下“发送按钮”时隐藏键盘,我使用了接受的答案,但是将上下文更改为 getApplication 并添加了 getWindow ()。

InputMethodManager inputManager = (InputMethodManager) getApplication().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);