从 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;
}
我向应用程序添加了首选项片段。我正在使用 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;
}