user3178137
user3178137

Reputation: 963

How to hide action bar for fragment?

How can I hide action bar for certain fragment? I have searched for the answer at stackoverflow, but I have only found a solution, which involves disabling action bar for main activity in android manifest. Since I need to disable action bar for one fragment, this is not an option. Any ideas? Thanks.

EDIT: min API level is 7, sherlock is not being used

Upvotes: 45

Views: 78065

Answers (12)

Juzor
Juzor

Reputation: 1

Kotlin solution:

Add this to your fragment's onCreateView():

(activity as AppCompatActivity).supportActionBar?.hide()

And add this to the fragment's OnDestroyView():

(activity as AppCompatActivity).supportActionBar?.show()

Upvotes: 0

Gnostic
Gnostic

Reputation: 31

If you're like me and have one main Activity and several Fragments, you can add a listener to your NavController in the main Activity's onCreate() method.

For instance, I only wanted it hidden in my Login Fragment, so I used this (Kotlin):

navController.addOnDestinationChangedListener { _, destination, _ ->
    if (destination.id == R.id.loginFragment) {
        supportActionBar?.hide()
    } else {
        supportActionBar?.show()
    }
}

This avoids having to add the call to show() in all the Fragments in which you do want the ActionBar.

Upvotes: 3

Anuj Kumar Rai
Anuj Kumar Rai

Reputation: 51

Paste the code in the fragments before inflating the layout to SHOW Action Bar ` //Kotlin statement

(activity as AppCompatActivity?)!!.supportActionBar!!.show()

Paste the code in the fragments before inflating the layout to Hide Action Bar ` //Kotlin statement

(activity as AppCompatActivity?)!!.supportActionBar!!.hide()

This works fine for me.

Upvotes: 5

macros013
macros013

Reputation: 769

As it was already mentioned, actionbar may be hidden by (requireActivity() as AppCompatActivity).supportActionBar?.hide() call. If you want to show it in some of your fragments and to hide it in some other fragments, it may be convenient to apply default (for your case) visibility in onViewCreated of your Base fragment:

abstract class BaseFragment : Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        (requireActivity() as AppCompatActivity).supportActionBar?.show()
    }
}

and to hide it in particular fragments:

class HiddenActionBarFragment : BaseFragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        (requireActivity() as AppCompatActivity).supportActionBar?.hide()
    }
}

This solution is more flexible than using onStart - onStop for visibility change because during the transition onStart of a different fragment will be called earlier than onStop of the current fragment. So the next fragment won't be able to 'override' actionar visibility applied in onStop of the current fragment.

Upvotes: 9

griffins
griffins

Reputation: 8246

Put this code in fragment in which you want to hide toolbar...

 @Override
public void onResume() {
    super.onResume();
    ((AppCompatActivity)getActivity()).getSupportActionBar().hide();
}
@Override
public void onStop() {
    super.onStop();
    ((AppCompatActivity)getActivity()).getSupportActionBar().show();
}

Upvotes: 26

Bad Loser
Bad Loser

Reputation: 3155

This solution is for complex non-AppCompat applications that use native ToolBar when running Lollipop onwards and native ActionBar otherwise.

It assumes you want to hide the ActionBar whenever Fragments are visible.

Inside onCreate() in each of your Activities:

getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() 
    {
        @Override
        public void onBackStackChanged() {
            U.ABkk(this, getFragmentManager().getBackStackEntryCount());
        }
    }
);

OR (much better) inside a 'singleton' class that implements Application.ActivityLifecycleCallbacks

@Override
public void onActivityCreated(final Activity A, Bundle savedInstanceState) {
    A.getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            U.ABkk(A, A.getFragmentManager().getBackStackEntryCount());
        }
    });
}

Inside the utility class:

/** Show/hide ActionBar for  KitKat devices */
public static void ABkk(Activity A, int count) {
    if (lollipop()) return;     // No problem when using Toolbar
    ActionBar ab = A.getActionBar();
    if (ab==null) return;
    if (count==1) { ab.hide(); }
    if (count==0) { ab.show(); }
}

/** Return true if API 21 or greater */
private static boolean lollipop() {
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
}   

Using onActivityCreated() is a solution that requires no changes to your Fragments or Activities!

Upvotes: 0

Arish Khan
Arish Khan

Reputation: 254

You can simply put this into your Fragment Class createView method:-

    View layout = inflater.inflate(R.layout.player_fragment, container, false);
    ((AppCompatActivity) getActivity()).getSupportActionBar().hide();

Upvotes: 7

Magus 14
Magus 14

Reputation: 71

Put getSupportActionBar().hide() before setContentView in the Activity that holds the fragments.

Also add this: ((AppCompatActivity) getActivity()).getSupportActionBar().hide() in the fragments before inflating layout. This works if you are using this ActionBarActivity.It also removes my lags in hiding action bar

Upvotes: 7

Gober
Gober

Reputation: 3662

If you are using AppCompatActivity (you should) then this is the solution that worked for me:

((AppCompatActivity) getActivity()).getSupportActionBar().hide();

You can add this in onCreate(). The support fragment's getActivity() returns a FragmentActivity, and this does not contain the getSupportActionBar() method. Using just getActionBar() gives null-pointer exception if you have AppCompatActivity.

Upvotes: 80

engico
engico

Reputation: 453

Hide actionBar using this in the required fragment.

getActivity().getSupportActionBar().hide();

And Show actionBar with this in your next fragment.

getActivity().getActionBar().show();

Upvotes: 8

Justin Muller
Justin Muller

Reputation: 1303

Have you tried getActivity().getSupportActionBar().hide() in the onCreate() of the fragment you wish the ActionBar to be hidden in?

I am assuming you are not using ActionBarSherlock.

Upvotes: 1

michal.luszczuk
michal.luszczuk

Reputation: 2903

getActionBar().hide() or getSupportActionBar().hide() (if using ActionBarCompat v7 lib). Regards

Upvotes: 8

Related Questions