如何解决BottomNavigation,FragmentManager 尚未附加到主机
我已将BottomNavigation 代码从MainActivity 移至我为BottomNaviction 创建的类,以使代码更有条理。当我移动代码时,我收到此错误 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.moataz.mox/com.moataz.mox.ui.view.activity.MainActivity}: java.lang.IllegalStateException: FragmentManager has not been attached to a host.
简短错误消息 FragmentManager has not been attached to a host
。
// The error is here
final FragmentManager fragmentManager = fragmentActivity.getSupportFragmentManager();
这是我的底部导航类
public class BottomNavigation extends BottomNavigationView {
FragmentActivity fragmentActivity = new FragmentActivity();
final Fragment homeFragment = new HomeFragment();
final Fragment searchFragment = new SearchFragment();
final Fragment videosFragment = new VideosFragment();
final Fragment favouriteFragment = new FavouriteFragment();
final Fragment premiumFragment = new PremiumFragment();
// The error is here
final FragmentManager fragmentManager = fragmentActivity.getSupportFragmentManager();
Fragment mainFragment = homeFragment;
public BottomNavigation(@NonNull Context context) {
super(context);
}
@SuppressLint("NonConstantResourceId")
public void initializeBottomNavigation() {
// first one transaction to add each Fragment
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment_layout,premiumFragment,"5").hide(premiumFragment);
fragmentTransaction.add(R.id.fragment_layout,favouriteFragment,"4").hide(favouriteFragment);
fragmentTransaction.add(R.id.fragment_layout,videosFragment,"3").hide(videosFragment);
fragmentTransaction.add(R.id.fragment_layout,searchFragment,"2").hide(searchFragment);
fragmentTransaction.add(R.id.fragment_layout,homeFragment,"1");
// commit once! to finish the transaction
fragmentTransaction.commit();
// show and hide them when click on BottomNav items
BottomNavigationView navigationView = findViewById(R.id.bottom_navigation);
navigationView.setonItemSelectedListener(item -> {
// start a new transaction
FragmentTransaction localFragmentTransaction = fragmentManager.beginTransaction();
// Todo: ADD Animations
switch (item.getItemId()) {
case R.id.home_item:
localFragmentTransaction.hide(mainFragment).show(homeFragment).commit();
mainFragment = homeFragment;
return true;
case R.id.search_item:
localFragmentTransaction.hide(mainFragment).show(searchFragment).commit();
mainFragment = searchFragment;
return true;
case R.id.videos_item:
localFragmentTransaction.hide(mainFragment).show(videosFragment).commit();
mainFragment = videosFragment;
return true;
case R.id.saved_item:
localFragmentTransaction.hide(mainFragment).show(favouriteFragment).commit();
mainFragment = favouriteFragment;
return true;
case R.id.premium_item:
localFragmentTransaction.hide(mainFragment).show(premiumFragment).commit();
mainFragment = premiumFragment;
return true;
}
return false;
});
}
private void initializeBottomNavigation() {
BottomNavigation bottomNavigation = new BottomNavigation(this);
bottomNavigation.initializeBottomNavigation();
}
我试图找到一个解决方案并理解错误,但在我的情况下我没有找到任何东西。那么这里的问题是什么,我该如何解决?
解决方法
您不能创建活动的新实例;活动实例仅由 Android 本身构建。为了获得活动参考,您唯一可以做的就是使用现有的。
public class BottomNavigation extends BottomNavigationView {
final FragmentActivity fragmentActivity;
...
final FragmentManager fragmentManager;
public BottomNavigation(@NonNull Context context,@NonNull FragmentActivity activity) {
super(context);
fragmentActivity = activity;
fragmentManager = fragmentActivity.getSupportFragmentManager();
}
...
}
并传递您现有的活动参考:
private void initializeBottomNavigation() {
FragmentActivity activity = this; // Or your activity reference
BottomNavigation bottomNavigation = new BottomNavigation(this,activity);
bottomNavigation.initializeBottomNavigation();
}
请注意,您仍需要将 BottomNavigation
附加到活动中的视图父级以使其可见。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。