检测后退button,但不要closuresdialogfragment

我有一个浮动对话框的对话框,其中包含一个特殊的键盘,当用户按下EditText字段(正常IME停止显示)时popup。

当用户按下后退button(就像正常的IME服务一样),但是对话框保持可见状态时,我希望键盘被解除(可见性= GONE)。 然而,就我在SO和其他地方相当广泛的阅读中所看到的,似乎没有办法做到这一点。

如果我将对话框设置为不可取消,那么我不会通过onCancel()或onDismiss()得到通知,因为对话框是不可取消的。

如果我将对话框设置为可取消,则会收到通知,但对话框将被解除。

我无法将onKeyListener附加到片段中的对话框,因为它被系统replace,因此片段可以处理对话框的生命周期。

有没有办法做到这一点? 或者为了碎片系统的目的,可以访问关键事件的检测function?

最好的方法和最干净的方法是在onCreateDialog()中创build的对话框中重写onBackPressed()。

@Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new Dialog(getActivity(), getTheme()){ @Override public void onBackPressed() { //do your stuff } }; } 

我有和你一样的问题,我已经解决了将onKeyListener附加到dialogfragment。

在DialogFragment的扩展类的方法onResume()中放入这些代码:

  getDialog().setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(android.content.DialogInterface dialog, int keyCode,android.view.KeyEvent event) { if ((keyCode == android.view.KeyEvent.KEYCODE_BACK)) { //Hide your keyboard here!!! return true; // pretend we've processed it } else return false; // pass on to be processed as normal } }); 

这里你可以find的一个问题是这个代码将被执行两次:一个是当用户按下后退button时,另一个是当他离开时按下它。 在这种情况下,您必须按事件过滤:

 @Override public void onResume() { super.onResume(); getDialog().setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(android.content.DialogInterface dialog, int keyCode, android.view.KeyEvent event) { if ((keyCode == android.view.KeyEvent.KEYCODE_BACK)) { //This is the filter if (event.getAction()!=KeyEvent.ACTION_DOWN) return true; else { //Hide your keyboard here!!!!!! return true; // pretend we've processed it } } else return false; // pass on to be processed as normal } }); } 

作为胡安·佩德罗·马丁内斯(Juan Pedro Martinez)答案的附录,我认为在看这个话题的时候,澄清一个具体的问题是有帮助的。

如果您希望创build一个新的DialogFragment并且拥有它,那么用户只能使用后退button取消它,从而消除了过早取消该片段的随机屏幕接触,那么这就是您要使用的代码。

在以前的代码中,你调用DialogFragment,你需要将可取消的设置设置为false,这样NOTHING就不会消除这个片段,也不会有stream浪的屏幕触及。

 DialogFragment mDialog= new MyDialogFragment(); mDialog.setCancelable(false); mDialog.show(getFragmentManager(), "dialog"); 

然后,在你的DialogFragment中,在这种情况下MyDaialogFragment.java,你添加onResume覆盖代码让对话框监听后退button。 当它被按下时,它将执行dismiss()来closures片段。

 @Override public void onResume() { super.onResume(); getDialog().setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(android.content.DialogInterface dialog, int keyCode,android.view.KeyEvent event) { if ((keyCode == android.view.KeyEvent.KEYCODE_BACK)) { // To dismiss the fragment when the back-button is pressed. dismiss(); return true; } // Otherwise, do nothing else else return false; } }); 

现在你的对话框将被调用“setCancelable”为false,意味着没有任何东西(没有外部的点击)可以取消它并closures它,并允许(从对话框本身)只有后退buttonclosures它。

Ganbatte!

 @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = new Dialog(getActivity(), getTheme()) { @Override public void onBackPressed() { //your code } }; return dialog; } 

在创build对话框时,重写onBackPressed和onTouchEvent:

  final Dialog dialog = new Dialog(activity) { @Override public boolean onTouchEvent(final MotionEvent event) { //note: all touch events that occur here are outside the dialog, yet their type is just touching-down boolean shouldAvoidDismissing = ... ; if (shouldAvoidDismissing) return true; return super.onTouchEvent(event); } @Override public void onBackPressed() { boolean shouldAvoidDismissing = ... ; if (!shouldSwitchToInviteMode) dismiss(); else ... } }; 
Interesting Posts