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 中的视图父级以使其可见。