All of my fragments are controlled through ActionBarActivity
(mainActivity), inside mainActivity a DrawerLayout
is implemented and all the child fragments are pushed through drawerLayout's list item click. The problem that I'm facing is after pushing a fragment through drawerLayout I want to change the drawer icon into back icon of ToolBar
so that user can navigate to previous fragment and to handle the callback of android.R.id.home
either inside the same fragment or inside the mainActivity.
The code that I am using is:
MainActivity.java
public class MainActivity extends ActionBarActivity { private DrawerLayout layoutDrawer; private ActionBarDrawerToggle drawerToggler; private Stack<Fragment> stack; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); stack = new Stack<Fragment>(); layoutDrawer = (DrawerLayout) findViewById(R.id.layout_drawer); drawerToggler = new ActionBarDrawerToggle(this, layoutDrawer, toolbar, R.string.app_name, R.string.app_name); layoutDrawer.setDrawerListener(drawerToggler); setUpDrawerList(); pushFragment(new FirstFragment(), true); Session.setContext(getApplicationContext()); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (drawerToggler.isDrawerIndicatorEnabled() && drawerToggler.onOptionsItemSelected(item)) return true; switch (item.getItemId()) { case android.R.id.home: Toast.makeText(this, "Back from activity", Toast.LENGTH_SHORT) .show(); return true; } return super.onOptionsItemSelected(item); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); drawerToggler.syncState(); } @Override public void onBackPressed() { popFragment(); } private void setUpDrawerList() { ListView listView = (ListView) findViewById(R.id.list_drawer); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, Arrays.asList(new String[] { "First Fragment", "Second Fragment" })); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { layoutDrawer.closeDrawers(); drawerToggler.setDrawerIndicatorEnabled(false); getSupportActionBar().setDisplayHomeAsUpEnabled(true); pushFragment(getFragment(position), true); } }); } private Fragment getFragment(int pos) { switch (pos) { case 0: return new FirstFragment(); case 1: return new SecondFragment(); } return null; } public void pushFragment(Fragment fragment, boolean add) { FragmentTransaction transation = getSupportFragmentManager() .beginTransaction(); if (add) stack.push(fragment); transation.replace(R.id.layout_content, fragment); transation.commit(); } public void popFragment() { if (!stack.isEmpty()) { Fragment fragment = stack.elementAt(stack.size() - 2); stack.pop(); pushFragment(fragment, false); } else super.onBackPressed(); drawerToggler.setDrawerIndicatorEnabled(stack.size() == 1); } public void clearBackStack() { stack.clear(); } }
FirstFragment.java
public class FirstFragment extends Fragment { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_first, container, false); } @Override public void onResume() { super.onResume(); ActionBar actionBar = ((ActionBarActivity)getActivity()).getSupportActionBar(); actionBar.setTitle("First Fragment"); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); menu.clear(); inflater.inflate(R.menu.fragment_menu, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case android.R.id.home: Toast.makeText(getActivity(), "Back from fragment", Toast.LENGTH_SHORT).show(); getActivity().onBackPressed(); return true; } return super.onOptionsItemSelected(item); } }
From the above code I am not able to get the callback of android.R.id.home
and setting home button is not working everytime actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
Any help will be really appreciated.
Thanks
Add a toolbar to your xml
<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Fragment title"/> </android.support.v7.widget.Toolbar>
Then inside your onCreateView method in the Fragment:
Toolbar toolbar = view.findViewById(R.id.toolbar); toolbar.setNavigationIcon(R.drawable.ic_back_button); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getActivity().onBackPressed(); } });
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With