Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Manage toolbar's navigation and back button from fragment in android

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

like image 357
Abhishek Dhiman Avatar asked Apr 10 '15 10:04

Abhishek Dhiman


Video Answer


1 Answers

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();     } }); 
like image 112
Vladimir Petrovski Avatar answered Oct 15 '22 19:10

Vladimir Petrovski