android 在fragment中如何监听返回键,home键

本文介绍如何在移动端应用中通过设置ListView属性和监听器来实现返回键的拦截及二次确认退出的功能。通过简单的代码示例展示了如何根据不同屏幕方向进行响应,并提供了具体的实现思路。

/*本文大部分来自:http://wujierd.iteye.com/blog/2104153  (作者:wujierd)*/

/*结合自己的多次拦截返回键尝试,并且加上了再按一次退出*/

在onCreateView()中:

lv_videolist.setFocusable(true);//这个和下面的这个命令必须要设置了,才能监听back事件。
        lv_videolist.setFocusableInTouchMode(true);
        lv_videolist.setOnKeyListener(backlistener);

在onCreateView()外部:

private View.OnKeyListener backlistener = new View.OnKeyListener() {
        @Override
        public boolean onKey(View view, int i, KeyEvent keyEvent) {
            if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
                if (i == KeyEvent.KEYCODE_BACK) {  //表示按返回键 时的操作
                   if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
                       getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                       return true;
                   }else if(downBacknum==0){
                       Toast.makeText(context, "再按一次退出", Toast.LENGTH_SHORT).show();
                       downBacknum=1;
                       return true;
                   }
                    return false;    //已处理
                }
            }
            return false;
        }
    };

 

这里面要说明的就是如下几点:

1.如果你要拦截该返回键:那么if判断是你需要拦截的条件,在拦截消费之后,return true即可。

2.downBacknum是一个初始为0的int,这样的话,在第一次点击的时候,就符合downBacknum==0的条件会弹出吐司来消耗这个返回键,

之后downBacknum=1,if为假,即不消耗该事件。(这样就实现了退出询问)





Android开发中,当需要处理返回事件时,可能会遇到某些场景下`onKeyDown()`或`onBackPressed()`无法正常监听返回的情况。以下是一些常见场景的解决方案和修复方法。 ### 在继承`TabActivity`的Activity中监听返回 当Activity继承自`TabActivity`时,直接重写`onKeyDown()`或`onBackPressed()`可能无法捕获到返回事件。解决方法是通过重写`dispatchKeyEvent()`函数来处理返回事件。示例代码如下: ```java @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN && (System.currentTimeMillis() - exitTime) > 2000) { UIHelper.ToastMessage(this, R.string.toast_dblclick_back_pressed); exitTime = System.currentTimeMillis(); return true; } return super.dispatchKeyEvent(event); } ``` 此方法通过在`dispatchKeyEvent()`中捕获返回事件并进行处理,从而绕过`onKeyDown()`或`onBackPressed()`无法生效的问题[^3]。 ### 在Fragment监听返回 如果需要在Fragment监听返回事件,可以通过为Fragment的根视图设置焦点和KeyListener来实现。具体步骤如下: 1. 设置根视图可聚焦。 2. 请求焦点。 3. 添加KeyListener以捕获返回事件。 示例代码如下: ```java binding.root.isFocusableInTouchMode = true; binding.root.requestFocus(); binding.root.setOnKeyListener((v, keyCode, event) -> { if (keyCode == KeyEvent.KEYCODE_BACK) { requireActivity().finish(); return true; } return false; }); ``` 这种方法确保Fragment能够捕获到返回事件并进行相应的处理[^4]。 ### 无法监听Home的原因 在Android系统中,Home的按下事件通常由系统保留,开发者无法直接监听Home的按下事件。这是由于系统安全机制的限制,防止应用程序干扰用户的正常操作。相比之下,返回可以通过上述方法进行监听和处理[^2]。 ### 相关问题 1. 如何在Fragment中实现返回的双击退出功能? 2. 为什么在继承`TabActivity`的Activity中`onBackPressed()`无法正常工作? 3. 有哪些替代方案可以监听Android设备上的Home事件? 4. 如何在不使用`onBackPressed()`的情况下处理返回事件? 5. 除了`dispatchKeyEvent()`方法,还有哪些方式可以在TabActivity中处理返回
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值