【发布时间】:2014-05-12 05:42:09
【问题描述】:
我通过扩展RelativeLayout 为我的应用创建了一个自定义视图。通过拖动ImageView,它以dialog 打开。它有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只有在我第二次按下后退按钮后才启动,即在键盘关闭之后。这就是为什么下面的解决方案不起作用的原因。
【问题讨论】:
标签: android view android-custom-view back-button