从 preferencesFragment 导航回 MapFragment 后变慢

MapFragment becomes slow after navigating back to it from a preferencesFragment

我向应用程序添加了首选项片段。我正在使用 ActionBar 下拉菜单导航到 Preferences Fragment,并使用 ActionBar 的 OnUpNavigation 按钮 return 到先前显示的片段,该片段使用 OnBackPressed 方法返回。

该应用程序还有一个由 NavController 控制的 BottomNavigationView,附加到 BottomNavigationView 的片段之一是 MapFragment。从 Fragment 到 Fragment 的所有导航都由 NavigationController 处理。

我的问题是,如果我从 MapFragment 导航到 Preferences Fragment,然后 return 返回到 MapFragment,那么地图将变得中途无响应并且有很多滞后。在地图变得缓慢且无响应后,如果我导航到另一个 Fragment 并返回到 MapFragment,则延迟消失并且 MapFragment 再次变得有响应。

unresponsive/laggy 行为似乎只影响 MapFragment。现在我想也许 Preferences Fragment 可能仍然在后台保持活动状态,所以我也尝试直接使用 popBackStack() 方法,但结果是一样的。 我在这里发现了另一个关于类似问题的问题 Google Maps v2 MapFragment is extremely laggy on returning from the backstack,但这并没有解决我的问题。

导航至首选项

 @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.settings:
                navController.navigate(R.id.settingsFragment);
                navView.setVisibility(View.GONE);
                return true;
                ...

处理后退按钮。

 @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return true;
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
            navView.setVisibility(View.VISIBLE);

    }

另外,这里是手机导航xml。

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mobile_navigation"
    app:startDestination="@+id/navigation_home">

    <fragment
        android:id="@+id/navigation_map"
        android:name="com.example.explore.ui.map.MapFragment"
        android:label="@string/title_map"
        tools:layout="@layout/fragment_map" />

    <fragment
        android:id="@+id/settingsFragment"
        android:name="com.example.explore.SettingsFragment"
        android:label="@string/title_settings"/>

    <!--Global action-->
    <action android:id="@+id/open_settings_fragment"
        app:destination="@id/settingsFragment"/>
</navigation>

如有不明之处请说明。 谢谢!

在导航回上一个片段后,我没有弄清楚如何解决无响应行为的问题,但我确实找到了解决方法。

基本上我只是得到了前一个 BackStack 条目,然后从那个条目我得到了那个条目的目的地,然后得到了那个条目的 Id 以使用那个 Id 导航到上一个片段。

    @Override
    public boolean onSupportNavigateUp() {
        NavBackStackEntry navBackStackEntry = navController.getPreviousBackStackEntry();
        NavDestination navDestination = navBackStackEntry.getDestination();
        int id = navDestination.getId();
        navController.navigate(id);
        return true;
    }