Ionic实现自定义返回按键事件
在 Android 和 Window 平台下,有时候我们需要监听返回按键的事件来进行相应的操作,也就是自定义返回按键事件。下面根据一个例子来讲解如何在 ionic 中自定义返回按键事件。
功能需求
首先看下要通过自定义返回按键事件来实现的需求(均在点击返回键操作之后):
- 如果键盘打开,则隐藏键盘;
- 如果显示 ionic 的 Loading 组件(在请求数据的时候),则隐藏 Loading 组件;
- 如果当前页面是子页面,则返回上个页面;如果是根页面,则提示用户是否退出应用。
具体实现
首先说明下,本示例的 ionic 应用的结构是 tabs 结构。
- 给
tabs.html中的ion-tabs定义别名,如mainTabs:
<ion-tabs #mainTabs selectedIndex="1">
<ion-tab [root]="tab1Root" tabTitle="页面1"></ion-tab>
<ion-tab [root]="tab2Root" tabTitle="页面2"></ion-tab>
</ion-tabs>
给 ion-tabs 定义别名的目的是方便通过代码找到 ion-tabs 的实例。
- 在
app.component.ts中进行实现代码编写(实现细节在注释中):
import { Component, ViewChild } from '@angular/core';
import { Nav, Platform, Keyboard, IonicApp, NavController, Tabs, ToastController, Toast } from 'ionic-angular';
@Component({
templateUrl: 'app.html'
})
export class AppComponent {
@ViewChild(Nav) nav: Nav; // ion-nav 引用
backButtonPressed: boolean = false; // 用于判断返回键是否触发
constructor(public platform: Platform,
public ionicApp: IonicApp,
public toastCtrl: ToastController,
public keyboard: Keyboard) {
// 等待平台加载完成之后注册返回按键事件
this.platform.ready().then(() => {
this.registerBackButtonAction(); // 注册返回按键事件
});
}
/**
* 注册返回按键事件
*/
registerBackButtonAction() {
// 使用 registerBackButtonAction 方法进行自定义事件处理程序
this.platform.registerBackButtonAction(() => {
// 如果键盘开启则隐藏键盘。实现要点:使用 ionic-plugin-keyboard 插件进行键盘的控制
if (this.keyboard.isOpen()) {
this.keyboard.close();
return;
}
// 隐藏加载动画。实现要点:通过 this.ionicApp._loadingPortal 获取到代表 Loading 的 OverlayPortal,然后获取当前被激活的 ViewController
const activePortal: any = this.ionicApp._loadingPortal.getActive();
if (activePortal) { // 如果有被激活的 ViewController 则将其隐藏。
activePortal.dismiss();
activePortal.onDidDismiss();
return;
}
// 根据当前导航进行不同的处理( mainTabs 对象是在 TabsPage 定义的 ion-tabs )
// 通过 this.nav.getActive().instance.mainTabs 获取到别名为 mainTabs 的 ion-tabs
const mainTabs: Tabs = this.nav.getActive().instance.mainTabs;
if (mainTabs) {
// 获取到当前被选中的 ion-tab
const mainNav: NavController = mainTabs.getSelected();
// 如果 ion-tab 能返回则返回上一个页面,不能就直接退出应用
mainNav.canGoBack() ? mainNav.pop() : this.showExit();
} else {
// 如果 ion-nav 能返回则返回上一个页面,不能就直接退出应用
this.nav.canGoBack() ? this.nav.pop() : this.showExit();
}
return;
}, 1);
}
/**
* 双击退出提示框
*/
showExit() {
if (this.backButtonPressed) { // 当触发标志为 true 时,即2秒内双击返回按键则退出APP
this.platform.exitApp();
} else {
const currentToast: Toast = this.toastCtrl.create({
message: '再按一次退出应用',
duration: 2000,
position: 'top'
});
currentToast.present().then(() => {
this.backButtonPressed = true;
// 2秒内没有再次点击返回则将触发标志标记为false
const id: any = setTimeout(() => {
clearTimeout(id);
this.backButtonPressed = false;
}, 2000);
});
}
}
}
Ionic实现自定义返回按键事件的更多相关文章
- vue JS实现监听浏览器返回按键事件
// 这个是监听浏览器回退键的returnButton () { let vm = this; $(document).ready(function () { if (window.history & ...
- 移动端默认返回按键,使用h5+修改默认事件
hbuilder的h5+提供开发webapp的诸多便利,很多手机自带back虚拟按键,如果不修改其默认事件,点一下app就退出了,所以我这里提供一种修改这个按键默认事件事件的代码. 首先你要用hbui ...
- Android按键事件传递流程(二)
5 应用层如何从Framework层接收按键事件 由3.2和4.5.4节可知,当InputDispatcher通过服务端管道向socket文件描述符发送消息后,epoll机制监听到了I/O事件, ...
- Android Tv 中的按键事件 KeyEvent 分发处理流程
这次打算来梳理一下 Android Tv 中的按键点击事件 KeyEvent 的分发处理流程.一谈到点击事件机制,网上资料已经非常齐全了,像什么分发.拦截.处理三大流程啊:或者 dispatchTou ...
- VBA中自定义类和事件的(伪)注册
想了解一下VBA中自定义类和事件,以及注册事件处理程序的方法. 折腾了大半天,觉得这样的方式实在称不上“注册”,所以加一个“伪”字.纯粹是瞎试,原理也还没有摸透.先留着,有时间再接着摸. 做以下尝试: ...
- 【百度地图API】如何给自定义覆盖物添加事件
原文:[百度地图API]如何给自定义覆盖物添加事件 摘要: 给marker.lable.circle等Overlay添加事件很简单,直接addEventListener即可.那么,自定义覆盖物的事件应 ...
- 转载 iOS拦截导航栏返回按钮事件的正确方式
原文链接:http://www.jianshu.com/p/25fd027916fa 当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮 ...
- input事件--->按键事件的基本实现
本程序基于TINY4412开发板,程序已经验证过,完全正确: 那么,如何来写这样的一个驱动程序呢? 1.分配一个input_dev结构体 2.设置 3.注册 4.硬件相关的代码,比如中断,定时器,休眠 ...
- 安卓Tv开发(二)移动智能电视之焦点控制(按键事件)
原文:http://blog.csdn.net/sk719887916/article/details/44781475 skay 前言:移动智能设备的发展,推动了安卓另一个领域,包括智能电视和智能家 ...
随机推荐
- Python3基础 函数 有参数有返回值 对传入的参数加1
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Go第七篇之规范的接口
接口本身是调用方和实现方均需要遵守的一种协议,大家按照统一的方法命名参数类型和数量来协调逻辑处理的过程. Go 语言中使用组合实现对象特性的描述.对象的内部使用结构体内嵌组合对象应该具有的特性,对外通 ...
- Autotools使用流程【转】
本文转载自:http://blog.csdn.net/scucj/article/details/6079052 手工写Makefile是一件很有趣的事情,对于比较大型的项目,如果有工具可以代劳,自然 ...
- POJ 2348 Euclid's Game(博弈)题解
题意:有a,b两个数字,两人轮流操作,每次可以选择两个之中较小的数字,然后另一个数字减去选择数字的任意倍数(不能减到负数),直到其中一个为0,不能操作为败 思路:这题用博弈NP思想,必败点和必胜点之间 ...
- ActiveMQ、RabbitMQ、RocketMQ、Kafka 对比(图示)
RabbitMQ 和 Kafka 对比,一篇好的介绍文章:https://my.oschina.net/u/236698/blog/501834 ActiveMQ.RabbitMQ.RocketMQ. ...
- BZOJ5168: [HAOI2014]贴海报 线段树
Description Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委 员 会为选民准备了一个张贴海报的electoral墙.张贴规则如下 ...
- [Shiro] - Shiro之进阶
上一个知识点ssm, 哪里需要权限,哪里写注解@RequirePermission就行. 但是,真正项目开发的时候, 这种方式就很有局限性了, 当权限配置关系发生变化, 每次都要修改代码, 编译打包重 ...
- Intellij IDEA 使用spring-boot-devtools无效解决办法一
Intellij IDEA 使用spring-boot-devtools maven依赖 ``` <dependency> <groupId>org.springframewo ...
- Remastersys -- 将正在使用的Ubuntu14.04 制作成镜像文件
remastersys 是一个能够备份你的ubuntu系统的工具. 源码在github上能找到:Remastersys Source 另外系统是 Ubuntu14.04/12.04 也可以直接 apt ...
- jekins 插件离线安装
官网插件地址:http://updates.jenkins-ci.org/download/plugins/ 系统管理->插件管理->高级 选择一个下载好的插件,然后点击上传即可 然后就会 ...