How to get Toolbar from fragment?
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();
Related videos on Youtube
Comments
-
anisart over 4 years
I have
ActionBarActivity
withNavigationDrawer
and use support_v7Toolbar
as ActionBar. In one of my fragments toolbar has custom view. In other fragmentsToolbar
should show title.How get
Toolbar
instance for customizing from fragments? I can get ActionBar withgetActivity().getActionBar()
, but if I callsetTitle()
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 over 9 yearsfragments do not have actionbars/toolbars activities do
-
LOG_TAG almost 9 years(MainAcivity)this.getActivity()).getToolbar(); will be the right answer!! for getting the Toolbar in fragment!!
-
-
LOG_TAG almost 9 yearsI 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 almost 9 yearsYou 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 almost 9 yearsyes 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 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 over 8 yearsThanks! Worked like HEYUL!! :) Btw, better to override parent Activity's
onOptionsItemSelected()
instead of Fragment's, to avoid code repetition. -
Darpan about 8 yearsgetting 'supportActionBar' and 'toolbar' is same thing?
-
Code_Life over 7 yearsBut is this the right way .. bcoz we have getSupportedActionBar also ?
-
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 almost 7 years@Darpan not sure
-
Kylo Ren over 5 yearsIf 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 over 4 years
!!
is completly avoidable with?
and it will save you a possible crash -
JonZarate over 4 yearsI believe this is better
(activity as? AppCompatActivity)?.supportActionBar?.show()
-
Trasd over 3 yearsIf 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.