Je suis confronté à un problème de gestion du bouton arrière du mobile par défaut qui vérifie la confirmation lors de la sortie de l'application, si j'appuie sur le bouton arrière, il devrait invoquer un gestionnaire qui affiche une fenêtre contextuelle, pour confirmer la sortie. OR il existe une méthode appelez registerBackButtonAction ()? Ou est-ce donc comment l'utiliser dans IONIC 2 ,? Veuillez m'aider. Merci d'avance.
Ceci est mon code résolu et fonctionnel. Merci tout le monde.
constructor(platform: Platform,public alertCtrl: AlertController,public toastCtrl:ToastController) {
platform.ready().then(()=>{
platform.registerBackButtonAction(()=>this.myHandlerFunction());
StatusBar.styleDefault();
Splashscreen.hide();
})
}
myHandlerFunction(){
let toast = this.toastCtrl.create({
message: "Press Again to Confirm Exit",
duration: 3000
});
toast.present();
}
Dans app.component.ts
@ViewChild(Nav) nav: Nav;
constructor(private platform: Platform, private toastCtrl: ToastController, private alertCtrl: AlertController) {
platform.ready().then(() => {
// Okay, so the platform is ready and our plugins are available.
// Here you can do any higher level native things you might need
platform.registerBackButtonAction(() => {
//uncomment this and comment code below to to show toast and exit app
// if (this.backButtonPressedOnceToExit) {
// this.platform.exitApp();
// } else if (this.nav.canGoBack()) {
// this.nav.pop({});
// } else {
// this.showToast();
// this.backButtonPressedOnceToExit = true;
// setTimeout(() => {
// this.backButtonPressedOnceToExit = false;
// },2000)
// }
if(this.nav.canGoBack()){
this.nav.pop();
}else{
if(this.alert){
this.alert.dismiss();
this.alert =null;
}else{
this.showAlert();
}
}
});
});
}
showAlert() {
this.alert = this.alertCtrl.create({
title: 'Exit?',
message: 'Do you want to exit the app?',
buttons: [
{
text: 'Cancel',
role: 'cancel',
handler: () => {
this.alert =null;
}
},
{
text: 'Exit',
handler: () => {
this.platform.exitApp();
}
}
]
});
alert.present();
}
showToast() {
let toast = this.toastCtrl.create({
message: 'Press Again to exit',
duration: 2000,
position: 'bottom'
});
toast.onDidDismiss(() => {
console.log('Dismissed toast');
});
toast.present();
}
Ionic la dernière version 3.xx
app.component.ts
fichier:
import { Platform, Nav, Config, ToastController } from 'ionic-angular';
constructor(public toastCtrl: ToastController, public platform: Platform) {
platform.ready().then(() => {
//back button handle
//Registration of Push in Android and Windows Phone
var lastTimeBackPress = 0;
var timePeriodToExit = 2000;
platform.registerBackButtonAction(() => {
// get current active page
let view = this.nav.getActive();
if (view.component.name == "TabsPage") {
//Double check to exit app
if (new Date().getTime() - lastTimeBackPress < timePeriodToExit) {
this.platform.exitApp(); //Exit from app
} else {
let toast = this.toastCtrl.create({
message: 'Press back again to exit App?',
duration: 3000,
position: 'bottom'
});
toast.present();
lastTimeBackPress = new Date().getTime();
}
} else {
// go to previous page
this.nav.pop({});
}
});
});
}
Platform api a un gestionnaire registerBackButtonAction
.
Vous pouvez faire quelque chose comme:
Dans app.component.ts
constructor(platform: Platform){
platform.ready().then(()=>{
platform.registerBackButtonAction(()=>this.myHandlerFunction());
})
myHandlerFunction(){
//create alert
}
Un peu tard pour la fête ... Mais il n'y a plus de bouton de retour autre que la fermeture des pages poussées, spécialement pour les projets avec plusieurs pages à onglets.
Parfois, une page n'est PAS poussée dans la page racine, mais dans l'une des navCtrl de la page à onglet. Nous devons donc vérifier pour chacun d'eux.
De plus, si aucune page ou menu n'est ouvert, nous devons encercler les derniers onglets utilisés (similaires à l'application Instagram) et revenir à l'onglet précédent. De plus, nous ne devons pas revenir à chaque onglet plus d'une fois (similaire à Instagram)
Je me suis inspiré des réponses ici et j'ai créé une méthode complète qui gère toutes les fonctionnalités nécessaires:
Les détails sont dans ce article de blog
Un code de démonstration peut être téléchargé à partir de mon github .
Html:
<button (click)="exitApp()">Close application<button>
Manuscrit:
import {Platform} from 'ionic-angular';
@Page({ /*...*/ })
export MyPage {
constructor(platform: Platform) {
this.platform = platform;
}
exitApp(){
this.platform.exitApp();
}
}
J'ai réussi à créer cette fonction en faisant beaucoup de recherches. J'espère que ça aide.
// I am using this.isExitAlertOpen just to make sure that the alert does not open if already open.
handleBackButton() {
this.platform.registerBackButtonAction(() => {
// const activePortal =
// this.ionicApp._modalPortal.getActive() ||
// this.ionicApp._loadingPortal.getActive() ||
// this.ionicApp._toastPortal.getActive() ||
// this.ionicApp._overlayPortal.getActive();
// console.warn('ACTIVE PORTALS', activePortal);
const activeModal = this.ionicApp._modalPortal.getActive();
console.warn('MODAL', activeModal);
activePortal peut être utilisé pour trouver les portails actifs pertinents qui incluent l'alerte, le chargeur, le modal, etc. Si vous voulez tout gérer avec le bouton de retour ou certains décommenter selon votre utilisation
Dans mon cas, je voulais seulement vérifier si le modal était actif, donc je n'ai vérifié que le modal.
// if (activePortal) {
// activePortal.dismiss();
// }
if (activeModal) {
activeModal.dismiss();
} else if (this.nav.canGoBack()) {
this.nav.pop();
} else {
if (this.isExitAlertOpen) return;
this.isExitAlertOpen = true;
this.showExitAlert();
}
});
}
showExitAlert() {
this.alertCtrl.create({
title: 'Exit',
message: 'Are you sure you want to exit the app?',
enableBackdropDismiss: false,
buttons: [
{
text: 'Yes',
handler: () => {
this.isExitAlertOpen = false;
this.platform.exitApp();
}
}, {
text: 'Cancel',
role: 'cancel',
handler: () => {
this.isExitAlertOpen = false;
}
}
]
}).present();
}