在 Ionic 3 和 Ionic 4 中处理硬件后退按钮
Handling hardware back button in Ionic3 Vs Ionic4
请在 ionic3
中找到 Android 硬件后退按钮操作的以下代码。由于 Ionic4
使用 angular 路由进行导航,弹出事件将如何发生在后退按钮上?如果我们想弹出到最后一页我们可以使用下面的代码this.navCtrl.goBack('/products');
。
但是我们如何将它用于 ionic4
中的 android 硬件后退按钮操作?
Ionic3 硬件后退按钮操作
this.platform.registerBackButtonAction(() => {
let activePortal = this.ionicApp._loadingPortal.getActive() ||
this.ionicApp._modalPortal.getActive() ||
this.ionicApp._toastPortal.getActive() ||
this.ionicApp._overlayPortal.getActive();
if (activePortal) {
activePortal.dismiss();
} else {
if (this.nav.canGoBack()) {
***this.nav.pop();***
} else {
if (this.nav.getActive().name === 'LoginPage') {
this.platform.exitApp();
} else {
this.generic.showAlert("Exit", "Do you want to exit the app?", this.onYesHandler, this.onNoHandler, "backPress");
}
}
}
});
更新: 这已在 v4.0.0-beta.8 (dfac9dc)
中修复
这是在 GitHub, in the Iconic Forum and Twitter
上跟踪的
在官方修复之前,您可以使用下面的解决方法。
使用 platform.backButton.subscribe
(参见 ) platform.backButton.subscribeWithPriority(0, ...)
to let ionic handle closing all the modals/alerts/... , the code ionic uses when its own back button is pressed and the new router-controller 我们得到这样的结果:
import { ViewChild } from '@angular/core';
import { IonRouterOutlet, Platform } from '@ionic/angular';
import { Router } from '@angular/router';
//...
/* get a reference to the used IonRouterOutlet
assuming this code is placed in the component
that hosts the main router outlet, probably app.components */
@ViewChild(IonRouterOutlet) routerOutlet: IonRouterOutlet;
constructor(
...
/* if this is inside a page that was loaded into the router outlet,
like the start screen of your app, you can get a reference to the
router outlet like this:
@Optional() private routerOutlet: IonRouterOutlet, */
private router: Router,
private platform: Platform
...
) {
this.platform.backButton.subscribeWithPriority(0, () => {
if (this.routerOutlet && this.routerOutlet.canGoBack()) {
this.routerOutlet.pop();
} else if (this.router.url === '/LoginPage') {
this.platform.exitApp();
// or if that doesn't work, try
navigator['app'].exitApp();
} else {
this.generic.showAlert("Exit", "Do you want to exit the app?", this.onYesHandler, this.onNoHandler, "backPress");
}
});
}
试试这个:
app.comonent.ts
import { Component, ViewChildren, QueryList } from '@angular/core';
import { Platform, ModalController, ActionSheetController, PopoverController, IonRouterOutlet, MenuController } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { Router } from '@angular/router';
import { Toast } from '@ionic-native/toast/ngx';
@Component({
selector: 'app-root',
templateUrl: 'app.component.html'
})
export class AppComponent {
// set up hardware back button event.
lastTimeBackPress = 0;
timePeriodToExit = 2000;
@ViewChildren(IonRouterOutlet) routerOutlets: QueryList<IonRouterOutlet>;
constructor(
private platform: Platform,
private splashScreen: SplashScreen,
private statusBar: StatusBar,
public modalCtrl: ModalController,
private menu: MenuController,
private actionSheetCtrl: ActionSheetController,
private popoverCtrl: PopoverController,
private router: Router,
private toast: Toast) {
// Initialize app
this.initializeApp();
// Initialize BackButton Eevent.
this.backButtonEvent();
}
// active hardware back button
backButtonEvent() {
this.platform.backButton.subscribe(async () => {
// close action sheet
try {
const element = await this.actionSheetCtrl.getTop();
if (element) {
element.dismiss();
return;
}
} catch (error) {
}
// close popover
try {
const element = await this.popoverCtrl.getTop();
if (element) {
element.dismiss();
return;
}
} catch (error) {
}
// close modal
try {
const element = await this.modalCtrl.getTop();
if (element) {
element.dismiss();
return;
}
} catch (error) {
console.log(error);
}
// close side menua
try {
const element = await this.menu.getOpen();
if (element) {
this.menu.close();
return;
}
} catch (error) {
}
this.routerOutlets.forEach((outlet: IonRouterOutlet) => {
if (outlet && outlet.canGoBack()) {
outlet.pop();
} else if (this.router.url === '/home') {
if (new Date().getTime() - this.lastTimeBackPress < this.timePeriodToExit) {
// this.platform.exitApp(); // Exit from app
navigator['app'].exitApp(); // work in ionic 4
} else {
this.toast.show(
`Press back again to exit App.`,
'2000',
'center')
.subscribe(toast => {
// console.log(JSON.stringify(toast));
});
this.lastTimeBackPress = new Date().getTime();
}
}
});
});
}
}
它对我有用,在 ionic v4 beta 中
这就是我在我的应用程序中的做法(使用 ionic4 开发,适用于 android 应用程序)。所以当用户点击 android phone 时,应用程序退出。
示例代码:
import { Component, AfterViewInit, OnDestroy } from '@angular/core';
import { Platform } from '@ionic/angular';
@Component({
selector: 'app-root',
templateUrl: 'app.component.html',
styleUrls: ['app.component.scss']
})
export class AppComponent implements AfterViewInit, OnDestroy {
constructor(private platform: Platform) { }
backButtonSubscription;
ngAfterViewInit() {
this.backButtonSubscription = this.platform.backButton.subscribe(() => {
// add logic here if you want to ask for a popup before exiting
navigator['app'].exitApp();
});
}
ngOnDestroy() {
this.backButtonSubscription.unsubscribe();
}
}
来源:here
使用 cordova 事件 "backbutton"
document.addEventListener("backbutton", youFunction, false);
我使用 ionic4/vue 并且有效
这是我在 Ionic 5 项目 上的工作代码。
使用 Cordova/PhoneGap
import {Component} from '@angular/core';
import {ToastService} from './_services/toast.service';
@Component({
selector: 'app-root',
templateUrl: 'app.component.html',
styleUrls: ['app.component.scss']
})
export class AppComponent {
constructor(private toastCtrl: ToastService) {
this.backButton();
}
backButton() {
const that = this;
let lastTimeBackPress = 0;
const timePeriodToExit = 2000;
function onBackKeyDown(e) {
e.preventDefault();
e.stopPropagation();
if (new Date().getTime() - lastTimeBackPress < timePeriodToExit) {
navigator.app.exitApp();
} else {
that.presentToast();
lastTimeBackPress = new Date().getTime();
}
}
document.addEventListener('backbutton', onBackKeyDown, false);
}
presentToast() {
const toast = this.toastCtrl.create({
message: "Press again to exit",
duration: 3000,
position: "middle"
});
toast.present();
}
}
在 Ionic 4 中自定义 Android 后退按钮 ... 每一页后退。
第 1 步:import { Platform, NavController } from '@ionic/angular';
第 2 步:constructor(public navCtrl: NavController){}
第 3 步:
private async onBack() {
this.navCtrl.navigateBack('/project-details');
}
第 4 步:
this.platform.backButton.subscribe(()=>{
this.onBack();
});
请在 ionic3
中找到 Android 硬件后退按钮操作的以下代码。由于 Ionic4
使用 angular 路由进行导航,弹出事件将如何发生在后退按钮上?如果我们想弹出到最后一页我们可以使用下面的代码this.navCtrl.goBack('/products');
。
但是我们如何将它用于 ionic4
中的 android 硬件后退按钮操作?
Ionic3 硬件后退按钮操作
this.platform.registerBackButtonAction(() => {
let activePortal = this.ionicApp._loadingPortal.getActive() ||
this.ionicApp._modalPortal.getActive() ||
this.ionicApp._toastPortal.getActive() ||
this.ionicApp._overlayPortal.getActive();
if (activePortal) {
activePortal.dismiss();
} else {
if (this.nav.canGoBack()) {
***this.nav.pop();***
} else {
if (this.nav.getActive().name === 'LoginPage') {
this.platform.exitApp();
} else {
this.generic.showAlert("Exit", "Do you want to exit the app?", this.onYesHandler, this.onNoHandler, "backPress");
}
}
}
});
更新: 这已在 v4.0.0-beta.8 (dfac9dc)
中修复这是在 GitHub, in the Iconic Forum and Twitter
上跟踪的
在官方修复之前,您可以使用下面的解决方法。
使用 platform.backButton.subscribe
(参见 platform.backButton.subscribeWithPriority(0, ...)
to let ionic handle closing all the modals/alerts/... , the code ionic uses when its own back button is pressed and the new router-controller 我们得到这样的结果:
import { ViewChild } from '@angular/core';
import { IonRouterOutlet, Platform } from '@ionic/angular';
import { Router } from '@angular/router';
//...
/* get a reference to the used IonRouterOutlet
assuming this code is placed in the component
that hosts the main router outlet, probably app.components */
@ViewChild(IonRouterOutlet) routerOutlet: IonRouterOutlet;
constructor(
...
/* if this is inside a page that was loaded into the router outlet,
like the start screen of your app, you can get a reference to the
router outlet like this:
@Optional() private routerOutlet: IonRouterOutlet, */
private router: Router,
private platform: Platform
...
) {
this.platform.backButton.subscribeWithPriority(0, () => {
if (this.routerOutlet && this.routerOutlet.canGoBack()) {
this.routerOutlet.pop();
} else if (this.router.url === '/LoginPage') {
this.platform.exitApp();
// or if that doesn't work, try
navigator['app'].exitApp();
} else {
this.generic.showAlert("Exit", "Do you want to exit the app?", this.onYesHandler, this.onNoHandler, "backPress");
}
});
}
试试这个: app.comonent.ts
import { Component, ViewChildren, QueryList } from '@angular/core';
import { Platform, ModalController, ActionSheetController, PopoverController, IonRouterOutlet, MenuController } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { Router } from '@angular/router';
import { Toast } from '@ionic-native/toast/ngx';
@Component({
selector: 'app-root',
templateUrl: 'app.component.html'
})
export class AppComponent {
// set up hardware back button event.
lastTimeBackPress = 0;
timePeriodToExit = 2000;
@ViewChildren(IonRouterOutlet) routerOutlets: QueryList<IonRouterOutlet>;
constructor(
private platform: Platform,
private splashScreen: SplashScreen,
private statusBar: StatusBar,
public modalCtrl: ModalController,
private menu: MenuController,
private actionSheetCtrl: ActionSheetController,
private popoverCtrl: PopoverController,
private router: Router,
private toast: Toast) {
// Initialize app
this.initializeApp();
// Initialize BackButton Eevent.
this.backButtonEvent();
}
// active hardware back button
backButtonEvent() {
this.platform.backButton.subscribe(async () => {
// close action sheet
try {
const element = await this.actionSheetCtrl.getTop();
if (element) {
element.dismiss();
return;
}
} catch (error) {
}
// close popover
try {
const element = await this.popoverCtrl.getTop();
if (element) {
element.dismiss();
return;
}
} catch (error) {
}
// close modal
try {
const element = await this.modalCtrl.getTop();
if (element) {
element.dismiss();
return;
}
} catch (error) {
console.log(error);
}
// close side menua
try {
const element = await this.menu.getOpen();
if (element) {
this.menu.close();
return;
}
} catch (error) {
}
this.routerOutlets.forEach((outlet: IonRouterOutlet) => {
if (outlet && outlet.canGoBack()) {
outlet.pop();
} else if (this.router.url === '/home') {
if (new Date().getTime() - this.lastTimeBackPress < this.timePeriodToExit) {
// this.platform.exitApp(); // Exit from app
navigator['app'].exitApp(); // work in ionic 4
} else {
this.toast.show(
`Press back again to exit App.`,
'2000',
'center')
.subscribe(toast => {
// console.log(JSON.stringify(toast));
});
this.lastTimeBackPress = new Date().getTime();
}
}
});
});
}
}
它对我有用,在 ionic v4 beta 中
这就是我在我的应用程序中的做法(使用 ionic4 开发,适用于 android 应用程序)。所以当用户点击 android phone 时,应用程序退出。
示例代码:
import { Component, AfterViewInit, OnDestroy } from '@angular/core';
import { Platform } from '@ionic/angular';
@Component({
selector: 'app-root',
templateUrl: 'app.component.html',
styleUrls: ['app.component.scss']
})
export class AppComponent implements AfterViewInit, OnDestroy {
constructor(private platform: Platform) { }
backButtonSubscription;
ngAfterViewInit() {
this.backButtonSubscription = this.platform.backButton.subscribe(() => {
// add logic here if you want to ask for a popup before exiting
navigator['app'].exitApp();
});
}
ngOnDestroy() {
this.backButtonSubscription.unsubscribe();
}
}
来源:here
使用 cordova 事件 "backbutton"
document.addEventListener("backbutton", youFunction, false);
我使用 ionic4/vue 并且有效
这是我在 Ionic 5 项目 上的工作代码。 使用 Cordova/PhoneGap
import {Component} from '@angular/core';
import {ToastService} from './_services/toast.service';
@Component({
selector: 'app-root',
templateUrl: 'app.component.html',
styleUrls: ['app.component.scss']
})
export class AppComponent {
constructor(private toastCtrl: ToastService) {
this.backButton();
}
backButton() {
const that = this;
let lastTimeBackPress = 0;
const timePeriodToExit = 2000;
function onBackKeyDown(e) {
e.preventDefault();
e.stopPropagation();
if (new Date().getTime() - lastTimeBackPress < timePeriodToExit) {
navigator.app.exitApp();
} else {
that.presentToast();
lastTimeBackPress = new Date().getTime();
}
}
document.addEventListener('backbutton', onBackKeyDown, false);
}
presentToast() {
const toast = this.toastCtrl.create({
message: "Press again to exit",
duration: 3000,
position: "middle"
});
toast.present();
}
}
在 Ionic 4 中自定义 Android 后退按钮 ... 每一页后退。
第 1 步:import { Platform, NavController } from '@ionic/angular';
第 2 步:constructor(public navCtrl: NavController){}
第 3 步:
private async onBack() {
this.navCtrl.navigateBack('/project-details');
}
第 4 步:
this.platform.backButton.subscribe(()=>{
this.onBack();
});