【问题标题】:Nativescript - Android TabView back button custom navigationNativescript - Android TabView 后退按钮自定义导航
【发布时间】:2019-06-15 23:56:56
【问题描述】:

在 Nativescript 应用程序中,当用户单击材料/软后退按钮时,我需要为 Android 实现自定义导航场景。

为简单起见,从登录标签模板 (https://github.com/ADjenkov/login-tabs-ng) 开始,我想实现类似 Instagram、Facebook、WhatsApp、Pinterest 等的导航...

这是登录选项卡模板的示例,当我从“球员”选项卡导航到“团队”选项卡,然后点击返回按钮时,我想返回“球员”选项卡(在我留在此选项卡中的页面上)。

今天,由于 Teams 选项卡出口的导航历史记录为空,而根出口的导航历史记录为空,应用程序已关闭。如果我在返回“球员”选项卡后点击后退按钮并且“球员”选项卡的导航历史记录为空,我希望它关闭。

我希望很清楚,如果不是这样,请告诉我。 有没有办法实现这种行为?

【问题讨论】:

  • 你必须监听activityBackPressed事件并在用户在Teams标签时设置args.cancel = true(通过在TabView上验证selectedIndex)然后通过url导航到Players标签。
  • 嗨@Manoj,感谢您的快速回复。实际上对于这个简单的案例它是有效的,但是如果有超过 2 个选项卡,我怎么知道用户之前在哪个选项卡中?换句话说,是否有“全局”浏览历史记录,还是每次用户第一次进入标签时我都必须手动存储?
  • @Manoj 完成:通过 url 导航到 Players 选项卡,我丢失了 Players 选项卡的当前导航历史记录。如果用户在某个玩家的详细信息上,他将返回到玩家列表,而不是到达他所在的页面

标签: nativescript tabview nativescript-angular router-outlet


【解决方案1】:

最后我实施了一个受@Manoj 回复启发的解决方案。

我收听activityBackPressed event 并设置args.cancel = true 以防止默认行为。

在每次选项卡更改时,我都会保存之前访问的选项卡。然后在每个activityBackPressed event 时,我都会检查当前插座是否可以返回this.routerExtension.canGoBack({ outlets: [this.tabVisibleName], relativeTo: this.activeRoute })

如果不是,如果访问的选项卡列表不为空,我会以编程方式返回上一个选项卡。如果访问的标签列表为空,我设置args.cancel = false 退出应用程序。

如果 this.routerExtension.canGoBack({ outlets: [this.tabVisibleName], relativeTo: this.activeRoute }) 返回 true,我只需返回:this.routerExtension.back({ outlets: [this.tabVisibleName], relativeTo: this.activeRoute });

注意:当应用程序进入后台时,您必须删除监听器,否则您将有多个监听器(一个通过恢复):

application.on(application.exitEvent, (args) => {
            if (args.android) {
                application.android.off(application.AndroidApplication.activityBackPressedEvent);
            }
        });

感谢您的帮助

【讨论】:

    【解决方案2】:

    您需要在 data.service 中保存选定的 Tab,当用户返回 tabs.component.html 时,您可以使用 selectedIndex。在这种情况下,您也可以跳过收听 activityBackPressed。

    在您的 tabs.component.html 中

    <TabView (selectedIndexChanged)="onSelectedIndexChanged($event)" [(ngModel)]="selectedTabIndex" width="100%">

    在你的 tabs.component.ts constructor( private routerExtension: RouterExtensions, private activeRoute: ActivatedRoute, private _dataService: DataService ) { this.selectedTabIndex = this._dataService.selectedTabIndex; }

    onSelectedIndexChanged(args: SelectedIndexChangedEventData) { const tabView = <TabView>args.object; const selectedTabViewItem = tabView.items[args.newIndex]; this._dataService.selectedTabIndex = args.newIndex; }

    【讨论】:

    • 它可能有效,但我已经实施了另一种解决方案,我将在下面描述。谢谢你的帮助
    猜你喜欢
    • 1970-01-01
    • 2018-10-09
    • 2016-04-01
    • 1970-01-01
    • 2012-01-03
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    相关资源
    最近更新 更多