【问题标题】:BottomNavigation, FragmentManager has not been attached to a hostBottomNavigation,FragmentManager 尚未附加到主机
【发布时间】:2021-10-01 14:30:04
【问题描述】:

我已将 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();

这是我的 BottomNavigation 类

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;
    });
}

在这里我已经在 MainActivity 中调用了我的类和方法

private void initializeBottomNavigation() {
BottomNavigation bottomNavigation = new BottomNavigation(this);
bottomNavigation.initializeBottomNavigation();

}

我试图找到一个解决方案并理解错误,但在我的情况下我没有找到任何东西。那么这里有什么问题,我该如何解决呢?

【问题讨论】:

    标签: java android android-studio kotlin bottomnavigationview


    【解决方案1】:

    您不能创建活动的新实例;活动实例仅由 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 附加到 Activity 中的视图父级以使其可见。

    【讨论】:

    • 这是一个很好的解释,谢谢。祝你有美好的一天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 2015-11-16
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    相关资源
    最近更新 更多