每次我在使用导航组件实现的 BottomNavigationView 中切换它们时,片段都会重新启动
Fragments restart everytime I switch between them inside BottomNavigationView implemented using Navigation component
所以我使用导航组件实现了底部导航,每次我在这些片段之间切换时,片段都会重新启动而不是重新加载以前的状态。导航组件应该自己处理这些情况吗?我在下面附上我的主要 activity 的 oncreate 方法代码。如有任何帮助,我们将不胜感激!
protected void onCreate(Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
getWindow().setExitTransition(new Fade());
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
iv = binding.logoAppbar;
toolbar = binding.toolbarMain;
appBarLayout = binding.appbarMain;
navViewBottom = binding.navViewBottom;
NavHostFragment navHostFragment =
(NavHostFragment) getSupportFragmentManager()
.findFragmentById(R.id.nav_host_fragment_activity_main);
navController = navHostFragment.getNavController();
setSupportActionBar(toolbar);
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
R.id.homeFragment, R.id.listingsFragment, R.id.featuredFragment, R.id.categoriesFragment
, R.id.accountFragment, R.id.howItWorksFragment, R.id.aboutUsFragment, R.id.sellingFeesFragment
, R.id.primeMembershipFragment)
.setOpenableLayout(drawerLayout)
.build();
NavigationUI.setupWithNavController(toolbar,navController,appBarConfiguration);
NavigationUI.setupWithNavController(navViewBottom,navController);
Objects.requireNonNull(getSupportActionBar()).setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu_icon);
}
这是我的 Home Fragment 代码,它在 SwipeRefreshLayout 内的协调器布局中有一个回收视图
@Override
public void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
@Override
public void handleOnBackPressed() {
// Handle the back button event
getActivity().finish();
}
};
requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
}
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
if (view == null) {
binding = FragmentHomeBinding.inflate(inflater, container, false);
view = binding.getRoot();
recyclerView = binding.recyclerViewHome;
shimmerFrameLayout = binding.shimmerLayoutHome;
appBarLayout = binding.appbarHome;
collapsingToolbarLayout = binding.collapsingToolbarHome;
swipeRefreshLayoutHome = binding.swipeRefreshLayoutHome;
recyclerView.setVisibility(View.GONE);
shimmerFrameLayout.setVisibility(View.VISIBLE);
shimmerFrameLayout.startShimmer();
listings = new ArrayList<>();
manager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
recyclerView.setItemViewCacheSize(20);
Retrofit retrofit = new Retrofit.Builder().baseUrl(getString(R.string.BASE_URL))
.addConverterFactory(GsonConverterFactory.create())
.build();
farmTenderApi = retrofit.create(API.class);
HomeRecyclerViewAdapter adapter = new HomeRecyclerViewAdapter(getContext(), listings);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(manager);
getFirstPage(pageNo, 10);
AppBarLayout.OnOffsetChangedListener mListener = new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
swipeRefreshLayoutHome.setEnabled(verticalOffset == 0);
}
};
appBarLayout.addOnOffsetChangedListener(mListener);
//swipe down to refresh
swipeRefreshLayoutHome.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
shimmerFrameLayout.startShimmer();
shimmerFrameLayout.setVisibility(View.VISIBLE);
recyclerView.setVisibility(View.GONE);
pageNo = 1;
listings.clear();
getFirstPage(1, 10);
}
});
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull @NotNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
isScrolling = true;
}
}
@Override
public void onScrolled(@NonNull @NotNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
currentItems = manager.getChildCount();
totalItems = manager.getItemCount();
scrolledOutItems = manager.findFirstVisibleItemPosition();
if (isScrolling && (currentItems + scrolledOutItems >= totalItems)) {
pageNo++;
isScrolling = false;
isLoading = true;
performPagination(pageNo, 10);
}
}
});
}
return view;
}
看来将我的依赖版本改成v2.4.0-alpha05已经解决了娱乐问题,感谢大家的帮助...
所以我使用导航组件实现了底部导航,每次我在这些片段之间切换时,片段都会重新启动而不是重新加载以前的状态。导航组件应该自己处理这些情况吗?我在下面附上我的主要 activity 的 oncreate 方法代码。如有任何帮助,我们将不胜感激!
protected void onCreate(Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
getWindow().setExitTransition(new Fade());
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
iv = binding.logoAppbar;
toolbar = binding.toolbarMain;
appBarLayout = binding.appbarMain;
navViewBottom = binding.navViewBottom;
NavHostFragment navHostFragment =
(NavHostFragment) getSupportFragmentManager()
.findFragmentById(R.id.nav_host_fragment_activity_main);
navController = navHostFragment.getNavController();
setSupportActionBar(toolbar);
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
R.id.homeFragment, R.id.listingsFragment, R.id.featuredFragment, R.id.categoriesFragment
, R.id.accountFragment, R.id.howItWorksFragment, R.id.aboutUsFragment, R.id.sellingFeesFragment
, R.id.primeMembershipFragment)
.setOpenableLayout(drawerLayout)
.build();
NavigationUI.setupWithNavController(toolbar,navController,appBarConfiguration);
NavigationUI.setupWithNavController(navViewBottom,navController);
Objects.requireNonNull(getSupportActionBar()).setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu_icon);
}
这是我的 Home Fragment 代码,它在 SwipeRefreshLayout 内的协调器布局中有一个回收视图
@Override
public void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
@Override
public void handleOnBackPressed() {
// Handle the back button event
getActivity().finish();
}
};
requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
}
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
if (view == null) {
binding = FragmentHomeBinding.inflate(inflater, container, false);
view = binding.getRoot();
recyclerView = binding.recyclerViewHome;
shimmerFrameLayout = binding.shimmerLayoutHome;
appBarLayout = binding.appbarHome;
collapsingToolbarLayout = binding.collapsingToolbarHome;
swipeRefreshLayoutHome = binding.swipeRefreshLayoutHome;
recyclerView.setVisibility(View.GONE);
shimmerFrameLayout.setVisibility(View.VISIBLE);
shimmerFrameLayout.startShimmer();
listings = new ArrayList<>();
manager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
recyclerView.setItemViewCacheSize(20);
Retrofit retrofit = new Retrofit.Builder().baseUrl(getString(R.string.BASE_URL))
.addConverterFactory(GsonConverterFactory.create())
.build();
farmTenderApi = retrofit.create(API.class);
HomeRecyclerViewAdapter adapter = new HomeRecyclerViewAdapter(getContext(), listings);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(manager);
getFirstPage(pageNo, 10);
AppBarLayout.OnOffsetChangedListener mListener = new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
swipeRefreshLayoutHome.setEnabled(verticalOffset == 0);
}
};
appBarLayout.addOnOffsetChangedListener(mListener);
//swipe down to refresh
swipeRefreshLayoutHome.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
shimmerFrameLayout.startShimmer();
shimmerFrameLayout.setVisibility(View.VISIBLE);
recyclerView.setVisibility(View.GONE);
pageNo = 1;
listings.clear();
getFirstPage(1, 10);
}
});
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull @NotNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
isScrolling = true;
}
}
@Override
public void onScrolled(@NonNull @NotNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
currentItems = manager.getChildCount();
totalItems = manager.getItemCount();
scrolledOutItems = manager.findFirstVisibleItemPosition();
if (isScrolling && (currentItems + scrolledOutItems >= totalItems)) {
pageNo++;
isScrolling = false;
isLoading = true;
performPagination(pageNo, 10);
}
}
});
}
return view;
}
看来将我的依赖版本改成v2.4.0-alpha05已经解决了娱乐问题,感谢大家的帮助...