BottomNavigation,FragmentManager 尚未附加到主机
BottomNavigation, FragmentManager has not been attached to a host
我已将 BottomNavigation 代码从 MainActivity 移动到我为 BottomNaviction 创建的 class 以使代码更有条理。当我移动代码时,我收到此错误 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();
这是我的底部导航 Class
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;
});
}
我在这里调用了 class 和 MainActivity
中的方法
private void initializeBottomNavigation() {
BottomNavigation bottomNavigation = new BottomNavigation(this);
bottomNavigation.initializeBottomNavigation();
}
我试图找到解决方案并理解错误,但在我的案例中我没有找到任何东西。那么这里的问题是什么,我该如何解决?
您不能创建 activity 的新实例; activity 个实例仅由 Android 自己构建。要获得 activity 参考,您唯一可以做的就是使用现有参考。
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();
}
...
}
并传递您现有的 activity:
private void initializeBottomNavigation() {
FragmentActivity activity = this; // Or your activity reference
BottomNavigation bottomNavigation = new BottomNavigation(this, activity);
bottomNavigation.initializeBottomNavigation();
}
请注意,您仍然需要将 BottomNavigation
附加到 activity 中的视图父级以使其可见。
我已将 BottomNavigation 代码从 MainActivity 移动到我为 BottomNaviction 创建的 class 以使代码更有条理。当我移动代码时,我收到此错误 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();
这是我的底部导航 Class
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;
});
}
我在这里调用了 class 和 MainActivity
中的方法private void initializeBottomNavigation() {
BottomNavigation bottomNavigation = new BottomNavigation(this);
bottomNavigation.initializeBottomNavigation();
}
我试图找到解决方案并理解错误,但在我的案例中我没有找到任何东西。那么这里的问题是什么,我该如何解决?
您不能创建 activity 的新实例; activity 个实例仅由 Android 自己构建。要获得 activity 参考,您唯一可以做的就是使用现有参考。
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();
}
...
}
并传递您现有的 activity:
private void initializeBottomNavigation() {
FragmentActivity activity = this; // Or your activity reference
BottomNavigation bottomNavigation = new BottomNavigation(this, activity);
bottomNavigation.initializeBottomNavigation();
}
请注意,您仍然需要将 BottomNavigation
附加到 activity 中的视图父级以使其可见。