当前位置:酷酷问答>百科问答>Android 双击返回键功能

Android 双击返回键功能

2024-12-02 23:55:36 编辑:zane 浏览量:530

Android 双击返回键功能

的有关信息介绍如下:

Android 双击返回键功能

android连续点击两次返回键退出应用,一般大家都是使用时间差来实现功能,现在来看下Handler机制简单实现方式

编写双击返回工具类DoubleClickExitHelper

public class DoubleClickExitHelper {

private final Activity mActivity;

private boolean isOnKeyBacking;

private Handler mHandler;

private Toast mBackToast;

public DoubleClickExitHelper(Activity activity) {

mActivity = activity;

mHandler = new Handler(Looper.getMainLooper());

}

/**

* Activity onKeyDown事件

* */

public boolean onKeyDown(int keyCode, KeyEvent event) {

if(keyCode != KeyEvent.KEYCODE_BACK) {

return false;

}

if(isOnKeyBacking) {

mHandler.removeCallbacks(onBackTimeRunnable);

if(mBackToast != null){

mBackToast.cancel();

}

mActivity.finish();

return true;

} else {

isOnKeyBacking = true;

if(mBackToast == null) {

mBackToast = Toast.makeText(mActivity, "再按一次返回", 2000);

}

mBackToast.show();

//延迟两秒的时间,把Runable发出去

mHandler.postDelayed(onBackTimeRunnable, 2000);

return true;

}

}

private Runnable onBackTimeRunnable = new Runnable() {

@Override

public void run() {

isOnKeyBacking = false;

if(mBackToast != null){

mBackToast.cancel();

}

}

};

}

在我们需要的Activity类中初始化DoubleClickExitHelper:

DoubleClickExitHelper doubleClick = new DoubleClickExitHelper(this);

重写OnKeyDown():

/**

* Returns:

* Return

* true to prevent this event from being propagated further, or false to

* indicate that you have not handled this event and it should continue to

* be propagated.

*/

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {

//在此可以调用

return doubleClick.onKeyDown(keyCode, event);

}

return super.onKeyDown(keyCode, event);

}

已完成,大家可以试试

当然在Android2.0后已经新增了onBackPressed();

/**

* Called when a key was pressed down and not handled by any of the views

* inside of the activity. So, for example, key presses while the cursor

* is inside a TextView will not trigger the event (unless it is a navigation

* to another object) because TextView handles its own key presses.

*

*

If the focused view didn't want this event, this method is called.

*

*

The default implementation takes care of {@link KeyEvent#KEYCODE_BACK}

* by calling {@link #onBackPressed()}, though the behavior varies based

* on the application compatibility mode: for

* {@link android.os.Build.VERSION_CODES#ECLAIR} or later applications,

* it will set up the dispatch to call {@link #onKeyUp} where the action

* will be performed; for earlier applications, it will perform the

* action immediately in on-down, as those versions of the platform

* behaved.

*

*

Other additional default key handling may be performed

* if configured with {@link #setDefaultKeyMode}.

*

* @return Return true to prevent this event from being propagated

* further, or false to indicate that you have not handled

* this event and it should continue to be propagated.

* @see #onKeyUp

* @see android.view.KeyEvent

*/

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_BACK) {

if (getApplicationInfo().targetSdkVersion

>= Build.VERSION_CODES.ECLAIR) {

event.startTracking();

} else {

onBackPressed();

}

return true;

}

if (mDefaultKeyMode == DEFAULT_KEYS_DISABLE) {

return false;

} else if (mDefaultKeyMode == DEFAULT_KEYS_SHORTCUT) {

if (getWindow().performPanelShortcut(Window.FEATURE_OPTIONS_PANEL,

keyCode, event, Menu.FLAG_ALWAYS_PERFORM_CLOSE)) {

return true;

}

return false;

} else {

// Common code for DEFAULT_KEYS_DIALER & DEFAULT_KEYS_SEARCH_*

boolean clearSpannable = false;

boolean handled;

if ((event.getRepeatCount() != 0) || event.isSystem()) {

clearSpannable = true;

handled = false;

} else {

handled = TextKeyListener.getInstance().onKeyDown(

null, mDefaultKeySsb, keyCode, event);

if (handled && mDefaultKeySsb.length() > 0) {

// something useable has been typed - dispatch it now.

final String str = mDefaultKeySsb.toString();

clearSpannable = true;

switch (mDefaultKeyMode) {

case DEFAULT_KEYS_DIALER:

Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + str));

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

break;

case DEFAULT_KEYS_SEARCH_LOCAL:

startSearch(str, false, null, false);

break;

case DEFAULT_KEYS_SEARCH_GLOBAL:

startSearch(str, false, null, true);

break;

}

}

}

if (clearSpannable) {

mDefaultKeySsb.clear();

mDefaultKeySsb.clearSpans();

Selection.setSelection(mDefaultKeySsb,0);

}

return handled;

}

}

版权声明:文章由 酷酷问答 整理收集,来源于互联网或者用户投稿,如有侵权,请联系我们,我们会立即处理。如转载请保留本文链接:https://www.kukuwd.com/answer/149536.html
热门文章