如何禁用某些片段的底部导航

how to disable bottom navigation for some fragment

你好,我在主 activity 中添加了一个底部导航,其余所有布局都是片段,现在我有一个登录片段,我不想显示底部导航,我什至不想分别在每个片段中包含底部导航,有什​​么方法可以在某些片段中禁用底部导航,例如登录片段

if you need more reference please tell me i will update the question

Main_Activity.java

public class MainActivity extends AppCompatActivity {

    BottomNavigationView bottomNavigationView;
    Deque<Integer> integerDeque = new ArrayDeque<>(4);
    boolean flag = true;

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        setContentView(R.layout.activity_main);
        Window window = this.getWindow();
        window.setStatusBarColor(this.getResources().getColor(R.color.black));
        bottomNavigationView = findViewById(R.id.bottom_navigation_view);
        integerDeque.push(R.id.nav_home);
        loadFragments(new Home_Fragment());
        bottomNavigationView.setSelectedItemId(R.id.nav_home);

        bottomNavigationView.setOnNavigationItemSelectedListener(
                item -> {
                    int id = item.getItemId();
                    if (integerDeque.contains(id)) {
                        if (id == R.id.nav_home) {
                            integerDeque.size();
                            if (flag) {
                                integerDeque.addFirst(R.id.nav_home);
                                flag = false;
                            }
                        }
                        integerDeque.remove(id);
                    }
                    integerDeque.push(id);
                    loadFragments(getFragment(item.getItemId()));
                    return false;
                }
        );

    }

    @SuppressLint("NonConstantResourceId")
    private Fragment getFragment(int itemId) {
        switch (itemId) {
            case R.id.nav_home:
                bottomNavigationView.getMenu().getItem(0).setChecked(true);
                return new Home_Fragment();
            case R.id.nav_following:
                bottomNavigationView.getMenu().getItem(1).setChecked(true);
                return new Following_Fragment();
            case R.id.nav_upload:
                bottomNavigationView.getMenu().getItem(2).setChecked(true);
                return new Upload_Fragment();
            case R.id.nav_notification:
                bottomNavigationView.getMenu().getItem(3).setChecked(true);
                return new Notification_Fragment();
            case R.id.nav_profile:
                bottomNavigationView.getMenu().getItem(4).setChecked(true);
                return new Profile_Fragment();
        }
        bottomNavigationView.getMenu().getItem(0).setChecked(true);
        return new Home_Fragment();
    }

    public void loadFragments(Fragment fragment) {
        if (fragment != null) {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.fragment_container, fragment, fragment.getClass().getSimpleName())
                    .commit();
        }
    }

    @Override
    public void onBackPressed() {
        integerDeque.pop();
        if (!integerDeque.isEmpty()) {
            loadFragments(getFragment(integerDeque.peek()));
        } else {
            finish();
        }
    }
}

更新 1 // 根据答案添加 login_fragment 但它不起作用

Login_Fragment.java

    public class Login_Fragment extends Fragment {
        @Nullable
        @org.jetbrains.annotations.Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
 if (getActivity() != null && getActivity() instanceof MainActivity)
            ((MainActivity) getActivity()).bottomNavigationView.setVisibility(View.GONE);
            return inflater.inflate(R.layout.login_fragment, container, false);
        }
    }

更新 2:- 好的,答案中给出的方法有效,但是当我转到上一个片段时,所有片段的底部导航都换了尿布,或者我说整个应用程序没有底部导航

您可以在片段中执行以下操作:

BottomNavigationView navBar = getActivity().findViewById(R.id.bottomBar);
navBar.setVisiblity(View.GONE);

 public class Login_Fragment extends Fragment {
    @Nullable
    @org.jetbrains.annotations.Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
    if (getActivity() != null && getActivity() instanceof MainActivity)
            ((MainActivity) getActivity()).bottomNavigationView.setVisibility(View.GONE);
   return inflater.inflate(R.layout.login_fragment, container, false);
       
    }
}

Hello I have added a bottom navigation in main activity and rest all of the layouts are fragments now I have a login fragment that I don't want to show the bottom navigation and I don't even want to include bottom navigation to each fragment separately ,is there any method where I can disable bottom navigation in some fragments like login fragment

因此,您不想对每个片段都进行处理,而只是对要隐藏 BottomNavigationView 的片段进行处理。

@Ali A. Jalil 提供了在访问登录片段时隐藏 BottomNavigationView 的部分答案;当这个片段在与你隐藏它的片段生命周期方法相反的片段生命周期方法中被销毁时,你可以再次显示它的方式相同;即您已将其隐藏在 onCreateView() 中,然后您需要在 onDestroyView() 中显示它。

 public class Login_Fragment extends Fragment {
    @Nullable
    @org.jetbrains.annotations.Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
        ((MainActivity) requireActivity()).bottomNavigationView.setVisibility(View.GONE);
        return inflater.inflate(R.layout.login_fragment, container, false);
    }
    
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ((MainActivity) requireActivity()).bottomNavigationView.setVisibility(View.VISIBLE);        
    }   
}   

这样,当您退出登录片段时,就BottomNavigationView可见性而言,您的状态与您进入登录片段时的状态相同。