How to get Toolbar from fragment?

167,542

Solution 1

You need to cast your activity from getActivity() to AppCompatActivity first. Here's an example:

((AppCompatActivity) getActivity()).getSupportActionBar().setTitle();

The reason you have to cast it is because getActivity() returns a FragmentActivity and you need an AppCompatActivity

In Kotlin:

(activity as AppCompatActivity).supportActionBar?.title = "My Title"

Solution 2

In case fragments should have custom view of ToolBar you can implement ToolBar for each fragment separately.

add ToolBar into fragment_layout:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimaryDark"/>

find it in fragment:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment, container, false);
        Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);

        //set toolbar appearance
        toolbar.setBackground(R.color.material_blue_grey_800);

        //for crate home button
        AppCompatActivity activity = (AppCompatActivity) getActivity();
        activity.setSupportActionBar(toolbar);
        activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

menu listener could be created two ways: override onOptionsItemSelected in your fragment:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
        case android.R.id.home:
            getActivity().onBackPressed();
    }
    return super.onOptionsItemSelected(item);
}

or set listener for toolbar when create it in onCreateView():

toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                return false;
            }
        });

Solution 3

You have two choices to get Toolbar in fragment

First one

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);

and second one

Toolbar toolbar = ((MainActivity) getActivity()).mToolbar;

Solution 4

toolbar = (Toolbar) getView().findViewById(R.id.toolbar);
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);

Solution 5

From your Fragment: ( get Toolbar from fragment?)

// get toolbar
((MainAcivity)this.getActivity()).getToolbar();  // getToolbar will be method in Activity that returns Toolbar!!  don't use getSupportActionBar for getting toolbar!!
// get action bar
this.getActivity().getSupportActionBar();

this is very helpful when you are using spinner in Toolbar and call the spinner or custom views in Toolbar from a fragment!

From your Activity:

// get toolbar
this.getToolbar();
// get Action Bar
this.getSupportActionBar();
Share:
167,542

Related videos on Youtube

anisart
Author by

anisart

Android developer

Updated on January 13, 2020

Comments

  • anisart
    anisart over 4 years

    I have ActionBarActivity with NavigationDrawer and use support_v7 Toolbar as ActionBar. In one of my fragments toolbar has custom view. In other fragments Toolbar should show title.

    How get Toolbar instance for customizing from fragments? I can get ActionBar with getActivity().getActionBar(), but if I call setTitle() for this instance ActionBar it do nothing.

    UPD:

    In my case

    ((ActionBarActivity) getActivity()).getSupportActionBar().setTitle();

    (as MrEngineer13 said) don't work at first fragment creation because I call it from onHiddenChanged(). Now I add more one to onCreateView() and it works fine.

    • tyczj
      tyczj over 9 years
      fragments do not have actionbars/toolbars activities do
    • LOG_TAG
      LOG_TAG almost 9 years
      (MainAcivity)this.getActivity()).getToolbar(); will be the right answer!! for getting the Toolbar in fragment!!
  • LOG_TAG
    LOG_TAG almost 9 years
    I just want confirm this the right way to do? if we load different fragment with toolbar in viewpager+ Tablayout or Pagertabstripe it will effect the app performance while swiping?
  • Marko
    Marko almost 9 years
    You have to have a method in your activity called getToolbar(), which is bad, because that is not how communication between activity and fragment should be done.
  • LOG_TAG
    LOG_TAG almost 9 years
    yes there is no other way for this!! many of the navigation drawer libs implement this style only !!! some times we need cast the activity because of AppCompatActivity (AppCompatActivity) getActivity() that is another pain point !!! all this stuffs totally kills the dev time :(
  • MattBoothDev
    MattBoothDev almost 9 years
    @LOG_TAG I have a drawer design with each fragment implementing the toolbar (and thus having a toolbar in it's layout file) and the above code worked great for me.
  • Aditya Naique
    Aditya Naique over 8 years
    Thanks! Worked like HEYUL!! :) Btw, better to override parent Activity's onOptionsItemSelected() instead of Fragment's, to avoid code repetition.
  • Darpan
    Darpan about 8 years
    getting 'supportActionBar' and 'toolbar' is same thing?
  • Code_Life
    Code_Life over 7 years
    But is this the right way .. bcoz we have getSupportedActionBar also ?
  • user25
    user25 over 7 years
    @ChadMx no, why he even wrote about adding toolbar in xml and so on. Author asked how to get toolbar programmatically from fragment . So stackoverflow.com/a/26998718/4548520 this is the best/right answer and it's short
  • Konstantin Konopko
    Konstantin Konopko almost 7 years
    @Darpan not sure
  • Kylo Ren
    Kylo Ren over 5 years
    If i add this, its changing the title.. But if i go back to the parent activity, how to change the title again ? I mean i have a nav drawer. Side drawer has some fragments and main activity has its own title. When i set title of main activity, it works and in fragment, the way you mentioned worked perfect. But how should i change the title of the activity on going back?
  • JonZarate
    JonZarate over 4 years
    !! is completly avoidable with ? and it will save you a possible crash
  • JonZarate
    JonZarate over 4 years
    I believe this is better (activity as? AppCompatActivity)?.supportActionBar?.show()
  • Trasd
    Trasd over 3 years
    If you are using a one-activity-to-many-fragments model, the first example simply gets you a reference to the main toolbar so you can manipulate it from your fragment. It is also, I believe, the best option.