我通过扩展
问题出现在edittext获得焦点并且键盘可见时,按下返回按钮后,软键盘将被取消,但是如果我再次按下返回按钮,那么不会取消自定义视图,而是调用了
以下是我的自定义视图代码:
RelativeLayout
创建了一个自定义视图用于我的应用程序。它作为dialog
打开,通过拖动一个ImageView
。它有EditTexts
和Buttons
。我重写了我的视图中的onKeyDown
,因为我需要拦截这个视图中的返回按钮。如果自定义视图可见,edittext没有获得焦点,如果我按下返回按钮,视图将被取消,这是期望的。问题出现在edittext获得焦点并且键盘可见时,按下返回按钮后,软键盘将被取消,但是如果我再次按下返回按钮,那么不会取消自定义视图,而是调用了
super.onKeyDown()
,我将退出我的应用程序,而期望的功能是在软键盘消失后取消视图。我做错了什么?以下是我的自定义视图代码:
public class AddTransactionView extends RelativeLayout implements View.OnClickListener {
private final String TAG = "AddTransactionView";
private Context context;
private ViewGroup parentView;
private FriendsDAO mFriendsDAO;
private AppPreference mAppPreference;
private ImageLoader imageLoader;
private DisplayImageOptions options;
private CircularImageView friendsImage;
private Button btnIOwe, btnTheyOwe;
private EditText edtTransactionDesc, edtTransactionAmt;
private RelativeLayout relAddTransaction;
private int status;
public AddTransactionView(Context context, View anchorView, int marginTop,
ViewGroup parentView, FriendsDAO mFriendsDAO) {
super(context);
Log.e(TAG, "AddTransactionView constructor");
this.context = context;
this.parentView = parentView;
this.mFriendsDAO = mFriendsDAO;
doInitialization();
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.add_transaction_popup, this);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
params.addRule(RelativeLayout.ABOVE, anchorView.getId());
params.setMargins(0, marginTop, 0, 0);
view.setLayoutParams(params);
this.setFocusableInTouchMode(true);
this.requestFocus();
parentView.addView(this);
initializeView(view, mFriendsDAO);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.e(TAG, "onKeyCodeDown");
if (keyCode == KeyEvent.KEYCODE_BACK) {
Log.e(TAG, "onKeyCodeDown if");
Log.e(TAG, "onKeyCodeDown else");
dismiss();
return true;
} else {
Log.e(TAG, "onKeyCodeDown default");
return super.onKeyDown(keyCode, event);
}
}
private void dismiss() {
parentView.removeView(this);
}
}
PS: 由于我的应用程序设计限制,我没有使用对话框或弹出窗口。
更新1
当键盘关闭时,焦点不会回到我的自定义视图。我尝试了下面建议的答案,但我发现在Android中键盘关闭时不会发送IME事件。有没有其他方法在键盘关闭后将焦点返回到我的视图上?
更新2 刚才,我发现EditText的onKeyListener只在我第二次按下返回按钮后触发,也就是在键盘关闭后。这就是为什么下面的解决方案不起作用的原因。