I have a activity with fragments under tabbed layout. This is my apps hierarchy => MainActivity.class > FragmentExplore.class > FragmentOne.class or FragmentTwo.class or FragmentTheree.class.
I want to set back button in the toolbar of the main activity. I tried to insert the java and xml code of the toolbar in all the xml and java file of these activity and fragments. But, the back button is not working.
This is the java and xml code of that toolbar's back button:
<com.google.android.material.appbar.AppBarLayout
...>
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
/>
</com.google.android.material.appbar.AppBarLayout>
Toolbar toolbar = view.findViewById(R.id.toolbar);
toolbar.setNavigationIcon(R.drawable.ic_rating);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getActivity(), "back pressed", Toast.LENGTH_SHORT).show();
}
});
Similarly, this is MainActivity.class:
public class MainActivity extends AppCompatActivity {
private final static String COLLAPSING_TOOLBAR_FRAGMENT_TAG = "collapsing_toolbar";
private final static String SELECTED_TAG = "selected_index";
private final static int COLLAPSING_TOOLBAR = 0;
private static int selectedIndex;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
selectedIndex = COLLAPSING_TOOLBAR;
getSupportFragmentManager().beginTransaction().add(R.id.fragment_container,
new FragmentExplore(), COLLAPSING_TOOLBAR_FRAGMENT_TAG).commit();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(SELECTED_TAG, selectedIndex);
}
}
}
FragmentExplore:
public class FragmentExplore extends Fragment {
public FragmentExplore() {
}
@Override
public void onAttach(Context activity) {
super.onAttach(activity);
mainActivity = (MainActivity) activity;
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tab_layout, container, false);
AppBarLayout appBarLayout = view.findViewById(R.id.tab_appbar_layout);
((CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams()).setBehavior(new AppBarLayoutBehavior());
tabLayout = view.findViewById(R.id.tabs);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);
viewPager = view.findViewById(R.id.viewpager);
viewPager.setOffscreenPageLimit(tab_count);
toolbar = view.findViewById(R.id.toolbar);
setupToolbar();
viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
tabLayout.post(new Runnable() {
@Override
public void run() {
tabLayout.setupWithViewPager(viewPager);
viewPager.setCurrentItem(1);
}
});
return view;
}
public class MyAdapter extends FragmentPagerAdapter {
private MyAdapter(FragmentManager fm) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
}
@Override
public Fragment getItem(int position) {...}
@Override
public int getCount() {
return tab_count;
}
@Override
public CharSequence getPageTitle(int position) {...}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
private void setupToolbar() {
toolbar.setTitle(getString(R.string.app_name));
mainActivity.setSupportActionBar(toolbar);
}
}
And FragmentOne.class:
public class FragmentOne extends Fragment {
View view;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.activity_frag_one, container, false);
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menuo, menu);
super.onCreateOptionsMenu(menu, inflater);
}
}
}
I tried to put those toolbar's xml and java code in different places but cann't solve this. thank you so much in advance.
You should set after call setSupportActionBar
try this
private void setupToolbar() {
mainActivity.setSupportActionBar(toolbar);
toolbar.setNavigationIcon(R.drawable.ic_rating);
mainActivity. getSupportActionBar().setTitle(getString(R.string.app_name));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getActivity(), "back pressed", Toast.LENGTH_SHORT).show();
}
});
}
Add it into tab_layout
and init it in onCreateView
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
/>