精华内容
下载资源
问答
  • Fragment中监听返回键

    千次阅读 2015-06-15 11:36:59
    有些时候在Activity中监听的返回键,但此Activity中的Fragment并不想返回键...下面的代码适合如下情况:一Activity中实现了连续两次点击物理返回键退出应用程序,但此Activity中的Fragment物理返回键功能是从Fragment

    有些时候在Activity中监听的返回键,但此Activity中的Fragment并不想返回键实现同样的功能,所以需要Fragment中监听返回键。令人失望的是Fragment并不能直接对物理返回键进行监听,所以需要自己另外去进行代码实现。

    下面的代码适合如下情况:一个Activity中实现了连续两次点击物理返回键退出应用程序,但此Activity中的Fragment物理返回键功能是从Fragment栈中移除此界面。


    宿主FragmentActivity要实现的接口,以便确定当前屏幕可见的Fragment

    public interface BackHandledInterface {
    
        public abstract void setSelectedFragment(BackHandledFragment selectedFragment);
    }

    主界面的FragmentActivity

    public class MainActivity extends FragmentActivity implements BackHandledInterface{
    
        private BackHandledFragment mBackHandedFragment;
    
        private Button mBtn;
    
        /** 上次点击返回键的时间 */
        private long lastBackPressed;
        /** 上次点击返回键的时间 */
        private static final int QUIT_INTERVAL = 2000;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            this.mBtn = (Button)findViewById(R.id.btn);
            this.mBtn.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    MyFragment f = new MyFragment();
                    FragmentManager fm = getSupportFragmentManager();
                    FragmentTransaction ft = fm.beginTransaction();
                    ft.replace(R.id.container, f);
                    ft.addToBackStack("tag");
                    ft.commit();
                }
            });
        }
    
        @Override
        public void setSelectedFragment(BackHandledFragment selectedFragment) {
            this.mBackHandedFragment = selectedFragment;
        }
    
        @Override
        public void onBackPressed() {
            if(mBackHandedFragment == null || !mBackHandedFragment.onBackPressed()){
                if(getSupportFragmentManager().getBackStackEntryCount() == 0){
                    long backPressed = System.currentTimeMillis();
                    if (backPressed - lastBackPressed > QUIT_INTERVAL) {
                        lastBackPressed = backPressed;
                        Toast.makeText(this, "再按一次退出", Toast.LENGTH_LONG).show();
                    } else {
                        finish();
                        System.exit(0);
                    }
                } else {
                    getSupportFragmentManager().popBackStack();
                }
            }
        }
    }

    Fragment的基类,实现对物理返回键的监听

    public abstract class BackHandledFragment extends Fragment {
    
        protected BackHandledInterface mBackHandledInterface;
    
        /**
         * 所有继承BackHandledFragment的子类都将在这个方法中实现物理Back键按下后的逻辑
         * FragmentActivity捕捉到物理返回键点击事件后会首先询问Fragment是否消费该事件
         * 如果没有Fragment消息时FragmentActivity自己才会消费该事件
         */
        protected abstract boolean onBackPressed();
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            if(!(getActivity() instanceof BackHandledInterface)){
                throw new ClassCastException("Hosting Activity must implement BackHandledInterface");
            }else{
                this.mBackHandledInterface = (BackHandledInterface)getActivity();
            }
        }
    
        @Override
        public void onStart() {
            super.onStart();
            //告诉FragmentActivity,当前Fragment在栈顶
            mBackHandledInterface.setSelectedFragment(this);
        }
    
    }
    

    显示在当前屏幕的Fragment

    public class MyFragment extends BackHandledFragment {
    
        private boolean hadIntercept;   
    
        @Override
        public View onCreateView(LayoutInflater inflater,
                @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            return getLayoutInflater(savedInstanceState).inflate(R.layout.fragment_a, null);
        }
    
        @Override
        protected boolean onBackPressed() {
            if(hadIntercept){
                return false;
            }else{
                getFragmentManager().popBackStack();
                hadIntercept = true;
                return true;
            }
        }
    }

    如果要在Fragment中的物理返回键实现其他功能,则可根据此代码另行改进。

    思路来源于另一位博友的优雅的让Fragment监听返回键 ,感谢这位博友。

    点击下载代码

    展开全文
  • 从网页监听Android设备的返回键

    千次阅读 2016-06-22 13:08:50
    最近搞Android项目的时候,遇到一...之所以说这需求蛋疼,是因为Android有物理返回键啊……返回键啊……键啊……啊…… 用户按下返回键后,预期应该跟点击页面上的返回键一样——返回App。然而这个返回键的被按

    最近做了一个抽奖活动,在苹果上运行起来是很正常,但是在Andriod 手机上就出现了问题:
    当我们刮了奖之后,抽奖的剩余次数为0,然后我们去填写领奖信息,如果这时候,我们按Andriod 手机上的“返回”按钮时,页面的抽奖剩余次数仍然为1(这是因为Andriod 手机的缓存造成的这个原因,当我们返回,就直接进入到了之前的缓存页面),
    为了解决这个问题,到https://github.com/iazrael/xback 中下载了xback.js,把这个文件下载下来,放到项目中去,然后直接调用方法:
    XBack.listen(function(){
    alert(‘oh! you press the back button’);
    });
    就直接在方法中写你要执行的操作就可以了。

    以下的文章是摘抄别人,我是根据的他的方法解决的(原文链接:http://www.html5cn.com.cn/android/2013-04-15/264.html

    最近搞Android项目的时候,遇到一个比较蛋疼的需求,需要从Client App调用系统浏览器打开一个页面,进行杂七杂八的一些交互之后,返回到App。如何打开浏览器和如何返回App这里就不说了,有兴趣的童鞋可私下交流。
    之所以说这个需求蛋疼,是因为Android有个物理返回键啊……返回键啊……键啊……啊……
    用户按下返回键后,预期应该跟点击页面上的返回键一样——返回App。然而这个返回键的被按下的时候网页完全不知道啊(onbeforeunload不算),找不到直接的办法去监听,愁死我们这全苦逼程序员鸟~
    虽然啊不能直接监听,曲线救国的办法,还是有滴。
    经过艰苦卓绝的寻找,发现使用HTML5的History可以稍微模拟到返回键的按下事件。原理如下:
    1.页面加载完成时,调用history.pushState写入一个指定状态STATE,并监听window.onpopstate;
    2.当onpopstate被触发时,检查event.state是否等于STATE,如果相等,表示页面发生了后退(按下返回键或者浏览器的后退按钮),则把这次行为当作是返回键被按下了(把点击浏览器的后退按钮也误算进来了,不过没啥好法子了呀)。
    嗯,为了方便调用,把这个逻辑稍微封装了下,代码见这里(https://github.com/iazrael/xback),使用方法如下:

    JavaScript:
    XBack.listen(function(){
        alert('oh! you press the back button');
    });
    
    XBack.listen(function(){
        alert('ah, press press press');
    });

    不过这个方法有些缺陷:
    1.如果项目本身使用了pushState,则历史记录会有瑕疵(多了一个历史);
    2.浏览器的后退按钮点击以及调用history.back()也会被当成按下了返回键。

    展开全文
  • cordova返回键backbutton功能捕获

    千次阅读 2014-06-23 00:06:10
    cordova拦截返回键 这功能是当用户按下返回键事件触发. backbutton 监听.调用 回调函数 如下:
    cordova拦截返回键  这个功能是当用户按下返回键事件触发.

    backbutton 监听.调用  回调函数 如下:

    document.addEventListener("backbutton", yourCallbackFunction, false); 


    注册事件监听,代表性的调用document.addEventListener,一旦你注册了 deviceready事件
    不再需要调用任何其他方法来覆盖theback-button行为。

    	function onLoad() {
    		document.addEventListener("deviceready", onDeviceReady, false);
    	}
    	function onDeviceReady() {
    		document.addEventListener("backbutton", onBackKeyDown, false);
    	}
    	function onBackKeyDown() {
    	}


    展开全文
  • Android返回键处理、任务和home键处理

    千次阅读 2017-05-26 13:12:59
    处理返回键的事件,监听任务键和home键的监听。

    处理返回键的事件,监听任务键和home键的监听。

    返回键

    对于一般应用,要对系统的返回键进行友好处理,不能让用户误触就返回到上一栈的页面,或者直接退出应用了。
    所以对于退出应用的时候,需要重写返回键的监听,对返回键点击处理。

    1. 对于音乐类、下载类应用需要返回桌面而不是关闭应用。
        private long time =0/**
         * 双击返回桌面
         */
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                if ((System.currentTimeMillis() - time > 1000)) {
                    Toast.makeText(this, "再按一次返回桌面", Toast.LENGTH_SHORT).show();
                    time = System.currentTimeMillis();
                } else {
                    Intent intent = new Intent(Intent.ACTION_MAIN);
                    intent.addCategory(Intent.CATEGORY_HOME);
                    startActivity(intent);
                }
                return true;
            } else {
                return super.onKeyDown(keyCode, event);
            }
    
        }
    1. 其他类应用
      private long time =0/**
         * 双击退出
         */
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                if ((System.currentTimeMillis() - time > 1000)) {
                    Toast.makeText(this, "再按一次退出应用", Toast.LENGTH_SHORT).show();
                    time = System.currentTimeMillis();
                } else {
                        //如果添加了actiyity的生命周期控制类,可需要进行操作
                        //如果有后台服务下载,就不能退出了。可以设置状态判断处理。
                      finish();
                      System.exit(0)
                }
                return true;
            } else {
                return super.onKeyDown(keyCode, event);
            }
    
        }

    home键和任务键

    以前4.0以下的系统是可以屏蔽系统的home键的,后来由于流氓应用谷歌不允许屏蔽掉home键.
    通过keyCode == KeyEvent.KEYCODE_HOME
    已经不会又返回结果了。
    现在被系统底层拦截住了,并会发送一个广播,在广播中设置监听回调。代码如下

    package com.hu.glmenu.utils;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    
    /**
     * Created by TT on 2017/5/26.
     */
    
    public class HomeListener {
        static final String TAG = "HomeListener";
        private Context mContext;
        private IntentFilter mFilter;
        private OnHomePressedListener mListener;
        private InnerRecevier mRecevier;
    
        // 回调接口
        public interface OnHomePressedListener {
            //home回调
             void onHomePressed();
            //任务回调
             void onHomeLongPressed();
        }
    
        public HomeListener(Context context) {
            mContext = context;
            //找到intent的标识ACTION_CLOSE_SYSTEM_DIALOGS指示意思为:
            //广播行为:当用户操作请求临时退出当前对话框时发送广播
            mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        }
    
        /**
         * 设置监听
         *
         * @param listener
         */
        public void setOnHomePressedListener(OnHomePressedListener listener) {
            mListener = listener;
            mRecevier = new InnerRecevier();
        }
    
        /**
         * 开始监听,注册广播
         */
        public void startWatch() {
            if (mRecevier != null) {
                mContext.registerReceiver(mRecevier, mFilter);
            }
        }
    
        /**
         * 停止监听,注销广播
         */
        public void stopWatch() {
            if (mRecevier != null) {
                mContext.unregisterReceiver(mRecevier);
            }
        }
    
        /**
         * 广播接收者
         */
        class InnerRecevier extends BroadcastReceiver {
            final String SYSTEM_DIALOG_REASON_KEY = "reason";
            final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
            final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
            final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
    
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
                    String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
                    if (reason != null) {
    //                    Log.e(TAG, "action:" + action + ",reason:" + reason);
                        if (mListener != null) {
                            if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                                // home键
                                mListener.onHomePressed();
                            } else if (reason
                                    .equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
                                // 任务键
                                mListener.onHomeLongPressed();
                            }
                        }
                    }
                }
            }
        }
    }
    

    上面写的为回调和广播类,所以需要在处理的activity中添加回调如下:
    在onResume和onPause中监听和注册广播

     @Override
        protected void onResume() {
            homeListener = new HomeListener(this);
            homeListener.setOnHomePressedListener(new HomeListener.OnHomePressedListener() {
                @Override
                public void onHomePressed() {
                    //处理按了home后的事
                    Log.e("tag==","Home键");
                }
    
                @Override
                public void onHomeLongPressed() {
                    //处理按了任务键后的事
                    Log.e("tag==","任务切换键");
                }
            });
            homeListener.startWatch();//注册广播
            super.onResume();
        }
    
        @Override
        protected void onPause() {
            homeListener.stopWatch();//注销广播
            super.onPause();
        }

    任务和home键现在只能做到监听效果,没法去拦截事件!要做到拦截估计要在framework层。

    展开全文
  • Ionic在android中返回键的处理问题

    千次阅读 2017-05-22 17:20:21
    一,一段代码就可以解决问题...//ionic点击系统返回键退出APP .run(function ($rootScope, $ionicPlatform, $state, $ionicHistory, $ionicPopup, $cordovaKeyboard, $timeout) { window.addEventListener('native.key
  • 在Android中,默认情况下按返回键就是退出应用;而要实现按返回键退出应用时弹出对话框就是在onKeyDown事件中添加监听,根据对话框中的选项实现退出与否。 效果图如下: @Override public boolean onKeyDown...
  • 注意:未经允许不可私自转载,违者必究 React Native官方文档:https://reactnative.cn/docs/backhandler/... ... 安卓返回键配置 本项目是用react-navigation来做路由,路由长度需要由redux来托管,所以下面代码会...
  • Android 返回键取消dialog的监听

    千次阅读 2016-01-14 10:57:23
    今天做一返回键取消下载更新,本以为用onBackPressed或者onKeyDown就可以监听到,但是发现并不行,后来又想在对话框取消后会执行Activity的onResume生命周期,又不行,发现是在被另外一Dialog类型的Activity...
  • **微信自定义返回键**

    千次阅读 2018-12-06 15:56:43
    指定点击回退按钮时跳转的url,代码如下: pushHistory(); window.addEventListener("popstate", function(e) { window.location.href='...//指定回退的地址 }, false); function pushHistory() { ... ...
  • 在Activity,Service,Window中监听Home键和返回键的一些思考,如何把事件传递出来的... 这其实大家都知道,首先我们要了解流程,你要屏蔽这个返回键,那你就要拿到这个返回键的事件了,所以我们要监听了,而在Activ
  • 大家好,欢迎大家浏览此篇博客,本篇主要讲解,如果用返回键实现退回手机主页面的方法 Activity中的moveTaskToBack方法。先介绍一下,我遇到这问题的场景。在做一款app时,平时在app的主页都喜欢做成连续点击2下...
  • 思路  在BaseActivity中重写onKeyDown方法,监听每页面的返回键点击操作,如果有两次返回键的点击时间间距小于两秒就退出程序Demo图片展示实现 创建一ExitApplication类 对所有Activity的退出进行管
  • 在安卓APP应用中,通常按下返回键后会关闭程序,有时候我们为了避免误按返回健导致程序的退出,会对按下返回健进行检测,并要求连续按下两次才退出程序。 在Delphi中开发安卓时,如何检测并实现两次退出APP呢。你...
  • android中如何实现连续点击返回键退出整个应用
  • 第一种是在自己的app下点击返回的时候页面不刷新,这有可能是你们原生开发人员,只是关闭了当前的一窗口,也就是说那个窗口是新开的。这种解决方案,老夫只能说找你们的原生开发吧。 第二种则是在微信、uc这类的...
  • 1、给应用实现仿微信按返回键app退到后台,并在通知栏里显示,首先实现按返回键退回后台: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { ...
  • Activity A跳转Activity B,再按返回键,A、B的生命周期执行顺序是什么? 当听到这题目的时候,我得意地笑了笑,对于Activity的生命周期已经记熟的我,心想,为什么不直接问Activity的生命周期呢?于是想当然的说...
  • 1.先下载mui.js,直接在vue项目中的index.html页面中引入进来2.在index.html中加入下面的代码<script> mui.init({ swipeBack: false, //关闭右滑关闭功能(默认就是false) keyEventBind: { back...
  • 最近在使用微信、支付宝、百度钱包实现网页支付,对支付...微信公众号内指定某个网页在点击返回键时不回退到上一级,而是直接关闭微信浏览器窗口 解决方案: 方法一:使用微信网页开发,调用JS-SDK API,wx.closeW...
  • 源由 原理 代码解决 思路 Ajax 请求函数 获取 id 和歌名 点击下载 利用 a 标签 ...每一次放假回家的时候,都会帮家里面的人下载歌曲,当然差不多用的都是网易云音乐网页版,但是只有客户端才提供下...
  • 模拟键盘按键

    千次阅读 2018-11-15 10:29:35
    当用户按下键盘上的一个键时,键盘内的芯片会检测到这动作,并把这信号传送到计算机。如何区别是哪一个键被按下了呢?键盘上的所有按键都有一编码,称作键盘扫描码。当你按下一个键时,这个键的扫描码就被传给...
  • 禁用Backspace ,ASP.NET按删除键返回上一张页面 在网页制作中,由于Backspace可以回退到上一网页,利用了缓存的数据,从而导致一些错误发生。网上一些文章:转贴:禁用浏览器后退之方法比较- - 浏览器的...
  • 开发中有这么场景,Android端下载文件,文件名字大多数都由我们app端定义,假如说,产品说,为了不让我们客户端写死,可以直接使用服务器返回的文件名字.好那么我们今天来研究一下 看下效果 调用的代码 ...
  • js 配合java springMVC后台,成功后返回消息,chrom ff都正常,只有IE提交后返回的JSON提示下载,查看类型 application/json google后发现原来是IE不支持该标识,所以一律作为文件下载 网上一般有三种方法:  一...
  • 场景:两APP,一是自己做的APP1,一是安卓市场下载的APP2;两WIFI,信息均已知。 目的:APP1打开时,连接到了WIFI1,APP1中有接口可以切换到APP2,但APP2需要连接WIFI2, 因此在切换前连接到了WIFI2。当用户...
  • 它不是回到之前的页面,而是启动了新的应用,之前的页面也没有被kill掉,按下返回键还是会回退到之前的页面,等于是打开了两相同的应用! 解决方案:这问题困扰了我很久,也查找了很多资料,也没有得到解决...
  • 由以上分析可以掌握最终返回按键的处理过程,如何结束当前 Activity 的,接下来要实现二次按返回键再关闭当前 Activity , 先声明当前主线程下的 Handler: Handler handler=new Handler(); 接下来重载 onKeyDown ...
  • android 键盘按键监听

    千次阅读 2016-03-02 10:11:41
    onKeyDown方法:该方法是接口KeyEvent.Callback中的抽象方法,所有的View全部实现了该接口并重写了该...参数keyCode,该参数为被按下的键值即键盘码,手机键盘中每按钮都会有其单独的键盘码,在应用程序都是通过
  • adb下载安装及使用

    万次阅读 多人点赞 2019-05-23 12:00:15
    它就是一命令行窗口,用于通过电脑端与模拟器或者是设备之间的交互。 ADB是一C/S架构的应用程序,由三部分组成: 运行在pc端的adb client: 命令行程序”adb”用于从shell或脚本中运行adb命令。首先,“adb”...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 174,038
精华内容 69,615
关键字:

下载个返回键