美文网首页ionic开发ionic2实战ionic3开发集锦
ionic2实战-完美处理安卓硬件返回按钮

ionic2实战-完美处理安卓硬件返回按钮

作者: 昵称已被使用_ | 来源:发表于2016-12-30 00:08 被阅读12816次

效果演示

源代码已上传到github

由于ionic版本更新较快,有些写法可能改变来不及更新简书,请以github代码为准

ionic2-完美处理安卓硬件返回按钮.gif

介绍

  • 注册安卓硬件返回按钮事件是必须的,因为用户不小心点击了返回按钮就退出app体验很不好. 所以当用户点击返回按钮,应该提示"再按一次退出"

  • 不想实现"再按一次退出",想实现像QQ一样按返回最小化app?可以看这里

  • ionic2更新比较快,Google找到的许多处理方法都是旧版本,下面就贴出package.json完整代码,截至目前是最新的
    {
    "name": "ionic-app-base",
    "author": "Ionic Framework",
    "homepage": "http://ionicframework.com/",
    "private": true,
    "scripts": {
    "clean": "ionic-app-scripts clean",
    "build": "ionic-app-scripts build",
    "ionic:build": "ionic-app-scripts build",
    "ionic:serve": "ionic-app-scripts serve"
    },
    "dependencies": {
    "@angular/common": "2.2.1",
    "@angular/compiler": "2.2.1",
    "@angular/compiler-cli": "2.2.1",
    "@angular/core": "2.2.1",
    "@angular/forms": "2.2.1",
    "@angular/http": "2.2.1",
    "@angular/platform-browser": "2.2.1",
    "@angular/platform-browser-dynamic": "2.2.1",
    "@angular/platform-server": "2.2.1",
    "@ionic/storage": "1.1.7",
    "ionic-angular": "2.0.0-rc.4",
    "ionic-native": "2.2.11",
    "ionicons": "3.0.0",
    "rxjs": "5.0.0-beta.12",
    "zone.js": "0.6.26"
    },
    "devDependencies": {
    "@ionic/app-scripts": "0.0.47",
    "typescript": "2.0.9"
    }
    }

  • 今天(2017年3月17日 10:12:31)升级到最新版本,代码不变,依然可以用,特此说明


核心代码

核心代码就4个文件,这4个文件中的完整代码如下

  1. app.html,添加#myNav,在app.component.ts文件通过@ViewChild('myNav')获取
    <ion-nav #myNav [root]="rootPage"></ion-nav>
  • app.component.ts

     import {Component, ViewChild} from '@angular/core';
     import {Platform, ToastController, Nav, IonicApp} from 'ionic-angular';
     import {StatusBar, Splashscreen} from 'ionic-native';
     import {TabsPage} from '../pages/tabs/tabs';
    
     @Component({
       templateUrl: 'app.html'
     })
     export class MyApp {
       rootPage = TabsPage;
       backButtonPressed: boolean = false;  //用于判断返回键是否触发
       @ViewChild('myNav') nav: Nav;
    
       constructor(public ionicApp: IonicApp, public platform: Platform, public toastCtrl: ToastController) {
         platform.ready().then(() => {
           StatusBar.styleDefault();
           Splashscreen.hide();
           this.registerBackButtonAction();//注册返回按键事件
         });
       }
    
       registerBackButtonAction() {
         this.platform.registerBackButtonAction(() => {
           //如果想点击返回按钮隐藏toast或loading或Overlay就把下面加上
           // this.ionicApp._toastPortal.getActive() || this.ionicApp._loadingPortal.getActive() || this.ionicApp._overlayPortal.getActive()
           let activePortal = this.ionicApp._modalPortal.getActive();
           if (activePortal) {
             activePortal.dismiss().catch(() => {});
             activePortal.onDidDismiss(() => {});
             return;
           }
           let activeVC = this.nav.getActive();
           let tabs = activeVC.instance.tabs;
           let activeNav = tabs.getSelected();
           return activeNav.canGoBack() ? activeNav.pop() : this.showExit()
         }, 1);
       }
    
       //双击退出提示框
       showExit() {
         if (this.backButtonPressed) { //当触发标志为true时,即2秒内双击返回按键则退出APP
           this.platform.exitApp();
         } else {
           this.toastCtrl.create({
             message: '再按一次退出应用',
             duration: 2000,
             position: 'top'
           }).present();
           this.backButtonPressed = true;
           setTimeout(() => this.backButtonPressed = false, 2000);//2秒内没有再次点击返回则将触发标志标记为false
         }
       }
    

    }

  • tabs.html,添加#mainTabs,在tabs.ts文件通过@ViewChild('mainTabs') tabs:Tabs;获取
    <ion-tabs #mainTabs>
    <ion-tab [root]="tab1Root" tabTitle="Home" tabIcon="home"></ion-tab>
    <ion-tab [root]="tab2Root" tabTitle="About" tabIcon="information-circle"></ion-tab>
    <ion-tab [root]="tab3Root" tabTitle="Contact" tabIcon="contacts"></ion-tab>
    </ion-tabs>

  • tabs.ts
    import {Component, ViewChild} from '@angular/core';
    import { HomePage } from '../home/home';
    import { AboutPage } from '../about/about';
    import { ContactPage } from '../contact/contact';
    import {Tabs} from "ionic-angular";

     @Component({
       templateUrl: 'tabs.html'
     })
     export class TabsPage {
       @ViewChild('mainTabs') tabs:Tabs;
       tab1Root: any = HomePage;
       tab2Root: any = AboutPage;
       tab3Root: any = ContactPage;
     
       constructor() {
       }
     }
    

今天(2017年3月21日 22:34:42)添加隐藏键盘事件


相关文章

网友评论

  • 4560a9342c12:在项目中遇到一个问题,是ion-select,在页面中点击开下拉框的时候,点击物理返回后,会把下拉框收回,但是就在也打不开下拉框了
  • HiZ小明:有用,谢谢。
  • de12d80639ce:军哥,我的demo是blank的空项目,不是tabs项目,android硬件返回的处理代码无效~~
    de12d80639ce:@小军617 :+1: 没问题啦 感谢~
    昵称已被使用_:@爱吃猫De鱼_534c
    用这段替换你的registerBackButtonAction方法
    registerBackButtonAction() {
    if (!this.nativeService.isAndroid()) {
    return;
    }
    this.platform.registerBackButtonAction(() => {
    if (this.keyboard.isOpen()) {//如果键盘开启则隐藏键盘
    this.keyboard.close();
    return;
    }
    //如果想点击返回按钮隐藏toast或loading或Overlay就把下面加上
    // this.ionicApp._toastPortal.getActive() ||this.ionicApp._loadingPortal.getActive()|| this.ionicApp._overlayPortal.getActive()
    let activePortal = this.ionicApp._modalPortal.getActive() || this.ionicApp._toastPortal.getActive() || this.ionicApp._overlayPortal.getActive();
    if (activePortal) {
    activePortal.dismiss();
    return;
    }
    let activeVC = this.nav.getActive();
    let activeNav = activeVC.getNav();
    return activeNav.canGoBack() ? activeNav.pop() : this.nativeService.minimize();//this.showExit()
    }, 1);
    }
  • hehehe:你好,我这边运行报:No provider for IonicApp!
    我把 ionicApp 放到app.module.ts的providers里 还是报错,请问要怎么解决?
  • 微光姑娘:我做的项目是登录页进去是首页(包括两个功能),点击其中一个功能才进入tabs,请问怎样做到物理键在首页返回时提示“在点击一次退出应用”
    昵称已被使用_:@定格牵手那一刻_922e 嗯.注释掉this.nativeService.minimize(),使用this.showExit()就可以了
    微光姑娘:@小军617 就按你之前发的这个简书《ionic3 教程(四)安卓硬件返回键处理》做,其他的步骤都不变,只改app.component.ts的代码?按照你上面发的这个链接里的改???
    昵称已被使用_:在此页面搜索showExit方法
    https://github.com/yanxiaojun617/ionic2_tabs/blob/master/src/app/app.component.ts
  • 237948f7cd59:军哥,我想问一下,如果不用这个样式呢 <ion-tabs #mainTabs> 改成<ion-content #xxx> 为什么不行呢,后台导入的import {Tabs} from '```````' 这个改为content , 应该怎么处理?
  • 萌二宝:请问如果直接退出app了 那么留在这个页面的数据应该如何处理呢,在哪里进行处理呢, 系统返回键能出发viewwillleave方法么, 求解大神:pray:
    萌二宝:@小军617 明白啦, 谢谢你啦:smiley:
    昵称已被使用_:this.platform.pause.subscribe(() => {//app进入后台模式事件

    });
    this.platform.resume.subscribe(() => {//app从后台恢复事件

    });

    你要问直接杀掉app进程怎么处理?那就只能定时保存数据,没办法监听用户何时杀掉进程
  • 微笑_eb29:你好,你在prod模式下有吗?我用ionic cordova build --prod --release打包的apk安装后,这个注册的返回事件没有执行
  • shen1996:您好 楼主, 借鉴了您的代码 发现返回键最小化没生效,测试发现this.nativeService.minimize()这句话没生效,不知道是不是这个原因求解答
    昵称已被使用_:@ai_25f8 你是不是没装插件?http://ionicframework.com/docs/native/app-minimize/
  • 53e594bc38dd:登录进入之后,返回键会返回到登录界面该如何解决?谢谢你
  • 韩国泡菜:还差点东西,只能在tab页面使用
    登录的单页跳转到tab无法使用
    let activeVC = this.nav.getActive();
    let page = activeVC.instance;

    if (!(page instanceof TabsPage)) {
    if (!this.nav.canGoBack()) {
    console.log('检测到在根视图点击了返回按钮。');
    return platform.exitApp();
    }
    console.log('检测到在子路径中点击了返回按钮。');
    return this.nav.pop();
    }
    还需要检测页面是否是tabs
    47ca23c0394a:抱歉,可以的,用楼主的那个显示吐司有问题
    47ca23c0394a:rootPage如果未LoginPage,返回按键就不起作用,加上这个也只能是非TabsPage会有返回或退出功能,到TabsPage页面的时候返回无响应
  • 75babac31fb2:你好我把这条注释去掉了,为什么点击返回键loader加载还在啊,用的loadingController?
    this.ionicApp._toastPortal.getActive() || this.ionicApp._loadingPortal.getActive() || this.ionicApp._overlayPortal.getActive()
  • 胡哈哈胡:今天又遇到一个问题,虽然说返回键是可以返回了,但是打开的一些弹窗,侧栏菜单,时间选择器等组件关不了,比如打开了一个alert选择窗口,按返回键它就直接返回主页面,那个窗口还在,请问这个怎么修复
    昵称已被使用_:@wang1992 看第88,89,90行https://github.com/yanxiaojun617/ionic2_tabs/blob/master/src/app/app.component.ts
    wang1992:我也遇到了 ,请问解决了吗
    e11860ff7b30:你好,这个问题你解决了么
  • 胡哈哈胡:您的代码起作用了😃😃
    昵称已被使用_: @胡玉军 66
  • 胡哈哈胡:你好,我今天在真机测试中发现用modalCtrl.creat()的一个子页面在用物理按键返回的时候,它会把页面关了,但是上面的按钮好像还在一样,点不了退出后的页面,倒是会点到已经关了的那个页面的按钮什么的,所以想请教一下怎么获得物理按键的点击事件?!?
  • 75babac31fb2:Cannot find module "ionic-native" 提示这个是什么问题呢?是什么依赖没有装吗?
    75babac31fb2:@小军617 非常感谢,已经可以用了。:grin: :grin:
    昵称已被使用_:你是 import {StatusBar, Splashscreen} from 'ionic-native';这里出了问题吗?最新版app导入插件的方式不一样了
    import {StatusBar} from '@ionic-native/status-bar';
    import {SplashScreen} from '@ionic-native/splash-screen';
    具体看官网.
  • f3fd7ec6d230:感觉很好,能转走吗,谢谢
    昵称已被使用_:@早安午安晚安_81f7 可以
  • 8242e2fd8fbc:你好,为什么我用这种方法,点击返回键还是会退出应用。我下载你的源码,运行也是这样的结果。
    bb4e613de457:@小军617 请问你是如何做到跳转到子页面底部的tabs不见的????
    昵称已被使用_:扫描二维码可以下载我的app看看https://github.com/yanxiaojun617/ionic2_tabs/
    昵称已被使用_:.....已经很多人可以了哦哦
  • 7ee444e6c539:activeVC.instance.tabs 获取不到,instance提示是私有变量,请问你是怎么解决这个问题的
    昵称已被使用_:@傲骨雄风 你在tabs.ts有没有添加 @ViewChild('mainTabs') tabs:Tabs;
    8242e2fd8fbc:我的是ionic-angular3.0.1版本,也是tabs获取不到,导致后面的getSelected()方法也是无效的。
    昵称已被使用_:@丁丁在寻找当当
    源码是这样的
    /** @private */
    instance: any;

    这个属性被注释为private不是,但其实还不是private,可以获取
    我已经升级到最新版,测试没问题的,你不妨下载我的源码测试
  • 3bbeb6916afa:出错了,activeVC.instance.tabs 根本就获取不到,instance提示是私有变量,没法获取
    昵称已被使用_:@XQLO 这个问题解决了没有?
  • 2ebeffc6cb75:您好,怎么样才能在扫码界面和拍照界面添加ion-nav-bar,便于返回上层页面,谢谢
  • 5a2f4d43b4ac:你好,怎么样才能导入项目
    昵称已被使用_:就修改几个文件而已,看懂后复制到你的文件
  • ed9a543988da:registerBackButtonAction中的代码过于臃肿了,其实你的需求只需要在activeNav.canGoBack()==false时执行你的业务;否则执行app.navPop()就好了,不需要自己在重新实现一遍普通的返回动作。
    昵称已被使用_:感谢回复,当时实现此功能就很惊喜.现在已优化

本文标题:ionic2实战-完美处理安卓硬件返回按钮

本文链接:https://www.haomeiwen.com/subject/gpopvttx.html