Nit*_*ish 8 android view back-button android-custom-view
我通过扩展为我的应用创建了一个自定义视图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);
}
}
Run Code Online (Sandbox Code Playgroud)
PS:由于我的应用程序中的设计限制,我没有使用对话框或弹出窗口.
更新1
键盘关闭时,焦点不会切换回我的自定义视图.我尝试了下面的建议答案,但我发现,当键盘被解除时,android不会发送IME事件.在键盘解雇后,还有其他方法可以将焦点恢复到我的视野吗?
更新2 刚才,我发现edittext的onKeyListener只在我第二次按回按钮后才启动,即在解除键盘后.这就是为什么下面的解决方案没有奏效的原因.
Nit*_*ish 14
我终于解决了我的问题,解决方法是使用dispatchKeyEventPreIme.以下是我的实际代码片段:
@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
Log.e(TAG, "dispatchKeyEventPreIme(" + event + ")");
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
KeyEvent.DispatcherState state = getKeyDispatcherState();
if (state != null) {
Log.e(TAG, "dispatchKeyEventPreIme state != null");
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getRepeatCount() == 0) {
Log.e(TAG, "dispatchKeyEventPreIme ACTION_DOWN");
state.startTracking(event, this);
return true;
} else if (event.getAction() == KeyEvent.ACTION_UP
&& !event.isCanceled() && state.isTracking(event)) {
Log.e(TAG, "dispatchKeyEventPreIme ACTION_UP");
if (edtTransactionAmt.hasFocus()
|| edtTransactionDesc.hasFocus()) {
Log.e(TAG, "dispatchKeyEventPreIme edittext has focus");
AppUtils.hideSoftKeyboard(context, edtTransactionAmt);
edtTransactionAmt.clearFocus();
edtTransactionDesc.clearFocus();
} else {
Log.e(TAG, "dispatchKeyEventPreIme dismiss view");
dismiss();
}
return true;
}
}
}
return super.dispatchKeyEventPreIme(event);
}
Run Code Online (Sandbox Code Playgroud)
但实际的功劳归于这篇文章.
| 归档时间: |
|
| 查看次数: |
7379 次 |
| 最近记录: |