在我的活动中,软键盘应该或多或少总是打开。因此,当用户按下后退按钮时,活动应该正常完成。但是,默认的Android行为是在打开时关闭键盘。这使得用户必须单击两次才能退出活动。如何覆盖此行为,以便在按下后退按钮时活动始终完成,即使软键盘打开?有一些简单的方法可以做到吗?
我确信这是一个常见的问题,但我没有找到这个直接的问题。
答案 0 :(得分:1)
试试这个。
mEditText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
finish();
return false;
}
});
您可以隐藏键盘并完成活动。
如果你使用Dialog,你可以这样做。
mDialog.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (isShowDialog) {
isShowDialog = false;
mDialog.dismiss();
context.finish();
}
}
return false;
}
});
注意:它也可以在Dialog.Dismiss对话框中使用并执行某些操作。您可以使用v
,keyCode
,event
。它可以被大多数人使用。
答案 1 :(得分:1)
我有同样的情况。我尝试了很多方法,最后我得到了解决方案。在这里,我将与您分享。我已经使用CustomEditText解决了这个问题。
<强> CustomEditText.Java 强>
public class CustomEditText extends android.support.v7.widget.AppCompatEditText {
public CustomEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
OnKeyPreImeListener onKeyPreImeListener;
public void setOnKeyPreImeListener(OnKeyPreImeListener onKeyPreImeListener) {
this.onKeyPreImeListener = onKeyPreImeListener;
}
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
if(onKeyPreImeListener != null)
onKeyPreImeListener.onBackPressed();
return false;
}
return super.dispatchKeyEvent(event);
}
public interface OnKeyPreImeListener {
void onBackPressed();
}
}
<强> MainActivity.Java 强>
public class MainActivity extends BaseActivity{
private CustomEditText editSearchMenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editSearchMenu =
(CustomEditText)findViewById(R.id.editSearchMenu);
//Initialise interface
CustomEditText.OnKeyPreImeListener onKeyPreImeListener=new CustomEditText.OnKeyPreImeListener() {
@Override
public void onBackPressed() {
((MainActivity)getActivity()).finish();
}
};
editSearchMenu.setOnKeyPreImeListener(onKeyPreImeListener);
}
}
xml文件
<com.app.helper.CustomEditText
android:id="@+id/editSearchMenu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/diam5dp"
android:background="@drawable/custom_rounded_edittext"
android:drawableLeft="@drawable/ico_search"
android:drawablePadding="@dimen/diam20dp"
android:drawableStart="@drawable/ico_search"
android:hint="@string/M_SEARCH_HINT"
android:padding="@dimen/diam10dp"
android:textColor="@android:color/white"
android:textColorHint="@android:color/white"
android:textSize="@dimen/diam16sp" />
希望这会对你有所帮助......这适用于我测试自己的每一个设备......其他解决方案在某些设备中产生问题......还有其他一些解决方案......如果你得到了什么让我知道...
答案 2 :(得分:1)
您应该实施TextWatcher
。
以下是您要求的代码。
public class MainActivity extends AppCompatActivity implements TextWatcher{
EditText editTextt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editTextt = (EditText) findViewById(R.id.editTextt);
editTextt.addTextChangedListener(this);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(before == count + 1)
{
finish();
}
}
}
答案 3 :(得分:0)
我使用此方法隐藏键盘
//hides keyoard
private void hideSoftKeyboard(View v) {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}