How to get Toolbar from fragment?
AndroidAndroid FragmentsAndroid ActionbarAndroid Support-LibraryAndroid ToolbarAndroid Problem Overview
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.
Android Solutions
Solution 1 - Android
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 - Android
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 - Android
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 - Android
toolbar = (Toolbar) getView().findViewById(R.id.toolbar);
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);
Solution 5 - Android
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();
Solution 6 - Android
For Kotlin users (activity as AppCompatActivity).supportActionBar?.show()
Solution 7 - Android
Maybe you have to try getActivity().getSupportActionBar().setTitle()
if you are using support_v7.
Solution 8 - Android
I did it by using these steps.
- Set Title using below code in
onCreateView
of the main fragment.((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your title");
- For swapping between fragments i'm using bottom navigation bar which is implemented on
MainActivity
(Parent Activity) of the fragment. Even if you are using any button or menu item then you can change the title fromonSelectedItemClickListener
, just like i did in my case.public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { switch (menuItem.getItemId()){ case R.id.menu_dashboard: getSupportActionBar().setTitle("Dashboard"); fm.beginTransaction().hide(active).show(dashboardFragment).commit(); active = dashboardFragment; return true; case R.id.menu_workshop: getSupportActionBar().setTitle("Workshops"); fm.beginTransaction().hide(active).show(workshopFragment).commit(); active = workshopFragment; return true; } return false; }
Solution 9 - Android
In XML
<androidx.appcompat.widget.Toolbar
android:id="@+id/main_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_scrollFlags="scroll|enterAlways">
</androidx.appcompat.widget.Toolbar>
Kotlin: In fragment.kt -> onCreateView()
setHasOptionsMenu(true)
val toolbar = view.findViewById<Toolbar>(R.id.main_toolbar)
(activity as? AppCompatActivity)?.setSupportActionBar(toolbar)
(activity as? AppCompatActivity)?.supportActionBar?.show()
-> onCreateOptionsMenu()
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.app_main_menu,menu)
super.onCreateOptionsMenu(menu, inflater)
}
->onOptionsItemSelected()
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.selected_id->{//to_do}
else -> super.onOptionsItemSelected(item)
}
}
Solution 10 - Android
if you are using custom toolbar or ActionBar and you want to get reference of your toolbar/action bar from Fragments then you need to first get instance of your Main Activity from Fragment's onCreateView Method like below.
MainActivity activity = (MainActivity) getActivity();
then use activity for further implementation like below
ImageView vRightBtn = activity.toolbar.findViewById(R.id.toolbar_right_btn);
Before calling this, you need to initialize your custom toolbar in your MainActivity as below.
First set define your toolbar public like
public Toolbar toolbar;
public ActionBar actionBar;
and in onCreate() Method assign the custom toolbar id
toolbar = findViewById(R.id.custom_toolbar);
setSupportActionBar(toolbar);
actionBar = getSupportActionBar();
That's It. It will work in Fragment.