Search code examples
javaandroidxmlandroid-fragmentsbottomnavigationview

Android: Is there a way to hide MainActivity layout elements in fragments?


My MainActivity layout includes a bottom navigation bar because I would like to use this as the main navigation components within my application's fragments. However, I have a login page which I do not want the navigation bar to be visible on. Since the fragment is being created from the MainActivity, it inherits the navigation bar and I can't find a way to hide it on the login fragment and show it on subsequent fragments.

For ease:

  1. I have a MainActivity layout with a BottomNavigationBar
  2. All fragments natively inherit the BottomNavigationBar from the MainActivity layout
  3. I want the visibility of the navigation bar to be "GONE" on the user login fragment
  4. I want the visibility of the navigation bar to be "VISIBLE" on the remaining fragments

Is there a way to do this?

The reason I am defining the BottomNavigationBar within the MainActivity is that I initially had a separate navigation bar on each fragment which required separate listeners on each fragment (making the code more extensive than it should be). Additionally, when I implemented the navigation bar as an individual component within each fragment, the item selected animations no longer functioned.

I have tried to use <include layout="@layout/main_activity android:visibility="GONE" android:layout_width="match_parent" android:layout_height="wrap_content"/> from within the login fragment but this has not worked.

I would appreciate any help people have on this matter.

Please feel free to let me know if you would like to see any of my code. I wasn't really sure which parts of my code would be relevant.


Solution

  • I would suggest you to use separate activities for this case - LoginActivity and MainActivity. Since you may at some point add ForgotPasswordFragment and maybe something else. To hide something you don't need in the first place is bad practice IMHO.

    In case you don't want to change your approach you can create BaseFragment that will have abstract val showBottomNavBar() and will override it in every fragment. And then in onViewCreated you'll check that flag and update UI accordingly.

    Something like this:

    abstract class BaseFragment : Fragment() {
      abstract val showBottomNavBar: Boolean
      //.. your other stuff
    }
    
    class FragmentA : BaseFragment() {
      override val showBottomNavBar = false
    
      override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        if (!showBottomNavBar) {
          (requireActivity() as YourAcitivy).hideNavBar() //this is bad
          someKindOfBroadcastManager.sendEvent(hideNavBar) // this is somewhat better
        }
      }
    } 
    

    But I would still suggest you to decouple login/main logic from single activity