问题
I have an EditText
in an Activity
and I want it to be active and soft-keyboard be open when I open that Activity
. Here is my xml
for EditText
:
<EditText
android:background="@null"
android:cursorVisible="true"
android:elegantTextHeight="true"
android:enabled="true"
android:focusable="true"
android:hint="Search"
android:id="@+id/editText11"
android:inputType="textNoSuggestions|textCapSentences"
android:layout_centerVertical="true"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:singleLine="true"
android:textColor="#000000"
android:textCursorDrawable="@null" />
and I have used android:windowSoftInputMode="stateVisible"
for the activity in which I have this EditText
.
The problem is, when I press back
once, the keyboard does not hide(ideally it does in all other EditText
s) and when I press back
again, it closes the Activity
. On the first back
press, I am not getting a call to onBackPressed()
while on the second back
press, I do. Why is this kind of behaviour is happening and how to resolve it?
Edit What I want is, if keyboard is open, pressing back should close the keyboard and if the keyboard is not open, then close the activity.
回答1:
Try this ...
create class called Util and put this code
public static void hideSoftKeyboard(Activity activity) {
final InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
if (inputMethodManager.isActive()) {
if (activity.getCurrentFocus() != null) {
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
}
}
and call on the onBackPressed() of Activity
回答2:
I add below code in my BaseActivity.java
@Override
protected void onPause() {
super.onPause();
final InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
if (inputMethodManager != null && inputMethodManager.isActive()) {
if (getCurrentFocus() != null) {
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
}
}
回答3:
Try like this,
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
//useful for hiding the soft-keyboard is:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
return true;
}
}
return super.onKeyDown(keyCode, event);
}
This may helps you
回答4:
As Your Requirement :
if keyboard is open, pressing back should close the keyboard and if the keyboard is not open, then close the activity
I Have tested my code is work fine.
Step 1 : Create CustomEditText
like below.
<com.yourpackage.yourappname.CustomEditText
android:id="@+id/edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
Step 2 : Create CustomEditText.java
class.
public class CustomEditText extends EditText {
Context context;
private static Activity mSearchActivity;;
public CustomEditText(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
if(mSearchActivity != null && event.getKeyCode() == KeyEvent.KEYCODE_BACK){
KeyEvent.DispatcherState state = getKeyDispatcherState();
if(state != null){
if(event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0){
InputMethodManager mgr = (InputMethodManager)
context.getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.hideSoftInputFromWindow(this.getWindowToken(), 0);
}
else if(event.getAction() == KeyEvent.ACTION_UP && !event.isCanceled() && state.isTracking(event)){
mSearchActivity.onBackPressed();
return true;
}
}
}
return super.dispatchKeyEventPreIme(event);
}
}
Step 3 : In Your Activity intialize the CustomEditText and hide KeyBoard like below.
CustomEditText editText = (CustomEditText) findViewById(R.id.edittext);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
Step 4: In Your Activity simply Override
the onBackPressed()
method.
@Override
public void onBackPressed() {
super.onBackPressed();
}
来源:https://stackoverflow.com/questions/37113535/hide-soft-keyboard-on-pressing-back