Welcome to the Treehouse Community
Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.
Looking to learn something new?
Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.
Start your free trial
Riley MacDonald
2,542 PointsAction Button Not Showing Drawable in Action Bar
I am trying to get an action button to appear in my action bar, however I am only able to get the action overflow to show up instead of the drawable. Here is what I see.
Here is my menu_friends.xml source:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:binder="http://schemas.android.com/apk/res-auto" >
<!-- action_friends should appear as action button -->
<item android:id="@+id/action_friends"
android:icon="@drawable/ic_account_plus_grey600_24dp"
android:title="@string/menu_edit_friends_label"
binder:showAsAction="always" />
</menu>
Here is the fragment where I am inflating the menu:
public class FriendsFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setHasOptionsMenu(true);
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_friends, container, false);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.menu_friends, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_friends:
navigateToEditFriends();
}
return super.onOptionsItemSelected(item);
}
private void navigateToEditFriends() {
Intent myIntent = new Intent(FriendsFragment.this.getActivity(), EditFriendsActivity.class);
startActivity(myIntent);
}
}
Here is my MainActivity code:
public class MainActivity extends FragmentActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private PagerSlidingTabStrip tabs;
private ViewPager pager;
private MyPagerAdapter adapter;
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
private CharSequence mDrawerTitle;
private CharSequence mTitle;
private String[] mDrawerItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTitle = mDrawerTitle = getTitle();
mDrawerItems = getResources().getStringArray(R.array.drawer_titles);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
// set a custom shadow that overlays the menu_main content when the drawer opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
// Add items to the ListView
mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, mDrawerItems));
// Set the OnItemClickListener so something happens when a
// user clicks on an item.
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
// Enable ActionBar app icon to behave as action to toggle the NavigationDrawer
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(
this,
mDrawerLayout,
R.string.drawer_open,
R.string.drawer_close
) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
/* // Set the default content area to item 0
// when the app opens for the first time
if(savedInstanceState == null) {
}*/
tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
pager = (ViewPager) findViewById(R.id.pager);
adapter = new MyPagerAdapter(getSupportFragmentManager());
pager.setAdapter(adapter);
final int pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources().getDisplayMetrics());
pager.setPageMargin(pageMargin);
tabs.setViewPager(pager);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
private class DrawerItemClickListener implements AdapterView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
navigateTo(position);
}
}
private void navigateTo(int position) {
switch(position) {
case 0:
navigateToSettings();
break;
case 1:
userLogout();
break;
}
mDrawerLayout.closeDrawer(mDrawerList);
}
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
public class MyPagerAdapter extends FragmentPagerAdapter {
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public CharSequence getPageTitle(int position) {
return (position ==0)? "Inbox" : "Friends";
}
@Override
public int getCount() {
return 2;
}
@Override
public Fragment getItem(int position) {
return (position ==0)? new InboxFragment() : new FriendsFragment();
}
}
private void userLogout() {
ParseFacebookUtils.getSession().closeAndClearTokenInformation();
ParseUser.logOut();
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
}
private void navigateToSettings() {
Intent intent = new Intent(this, Settings.class);
startActivity(intent);
}
}
Any help on this would be greatly appreciated! -R
1 Answer
Ken Alger
Treehouse TeacherRiley;
Just to understand what you are wanting to do better, you are attempting to add a custom icon in the ActionBar for a specific purpose? In working on a project recently, there are some images in the ActionBar which don't follow the standard drawables format and need some relatively involved programming to change them.
If you post back with something more specific about which icon you are attempting to alter perhaps I can direct you further.
Ken
Riley MacDonald
2,542 PointsRiley MacDonald
2,542 PointsHi Ken,
I am trying to add a custom icon into the ActionBar so that it can be pressed and open a new activity. I am essentially trying to do what is explained here: https://developer.android.com/training/basics/actionbar/adding-buttons.html
The problem is that my item is showing up as an overflow menu instead of a drawable icon. This is exactly what I see