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

Android

NavigationDrawer select item from View.Click

Hi this is my code: MainActivity:

public class MainActivity extends BaseActivity implements DrawerFragment.OnDrawerItemChangeListener, Toolbar.OnMenuItemClickListener { private final static String TAG = "MainActivity"; @InjectView(R.id.drawer_layout) DrawerLayout drawerLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ButterKnife.inject(this);

            if (savedInstanceState == null)
                    getSupportFragmentManager().beginTransaction()
                                    .replace(R.id.container, new StartFragment(), "fragment_start")
                                    .commit();
    }


    public void toggleDrawer() {
            if (drawerLayout.isDrawerOpen(Gravity.LEFT))
                    drawerLayout.closeDrawer(Gravity.LEFT);
            else
                    drawerLayout.openDrawer(Gravity.LEFT);
    }


    @Override
    public void onDrawerItemChange(EDrawerItem menuItem, boolean toggleMenu) {
            if (toggleMenu)
                    toggleDrawer();

            Fragment f = new StartFragment();
            String tag = "fragment_start";
            switch (menuItem) {
                    case HOME:
                            break;
                    case CALENDAR:
                            f = new CalendarFragment();
                            tag = "fragment_calendar";
                            break;
                    case DOCUMENTS:
                            f = new DocumentsListFragment();
                            tag = "fragment_documents_list";
                            break;
                    case CONTACTS:
                            f = new ContactsListFragment();
                            tag = "fragment_contacts_list";
                            break;
            }
            getSupportFragmentManager().beginTransaction()
                            .replace(R.id.container, f, tag)
                            .commitAllowingStateLoss();
    }

}

StartFragment:

public class StartFragment extends BaseFragment implements View.OnClickListener {

public StartFragment() {
}

@Override
public void onClick(View v) {
    MainActivity a = (MainActivity) getActivity();
    switch (v.getId()) {
        case R.id.container_calendar:
            a.onDrawerItemChange(EDrawerItem.CALENDAR, false);
            break;
        case R.id.container_documents:
            a.onDrawerItemChange(EDrawerItem.DOCUMENTS, false);
            break;
    }
}

}

Enum EDrawerItem:

public enum EDrawerItem { HOME(0), CALENDAR(1), DOCUMENTS(2), CONTACTS(3);

    private int value;

    EDrawerItem(int value) {
            this.value = value;
    }


    public static EDrawerItem valueFromInt(int v) {
            EDrawerItem item = HOME;
            switch (v) {
                    case 0:
                            item = HOME;
                            break;
                    case 1:
                            item = CALENDAR;
                            break;
                    case 2:
                            item = DOCUMENTS;
                            break;
                    case 3:
                            item = CONTACTS;
                            break;
            }
            return item;
    }

}

DrawerFragment:

public class DrawerFragment extends Fragment implements AdapterView.OnItemClickListener {

    @InjectView(android.R.id.list)
    ListView list;

    private DrawerAdapter mAdapter;
    private OnDrawerItemChangeListener mCallback;


    public DrawerFragment() {
    }


    @Override
    public void onAttach(Activity activity) {
            super.onAttach(activity);
            if (activity instanceof OnDrawerItemChangeListener) {
                    this.mCallback = (OnDrawerItemChangeListener) activity;
            }
    }


    @Override
    public void onDetach() {
            super.onDetach();
            mCallback = null;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_drawer, container, false);
    }


    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            ButterKnife.inject(this, view);


            mAdapter = new DrawerAdapter(getActivity());

            list.setDividerHeight(0);
            list.setAdapter(mAdapter);
            list.setOnItemClickListener(this);
    }


    @Override
    public void onDestroyView() {
            super.onDestroyView();
            ButterKnife.reset(this);
    }


    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if (mCallback != null)
                    mCallback.onDrawerItemChange(EDrawerItem.valueFromInt(position), true);
            mAdapter.setSelectedIndex(position);
            mAdapter.notifyDataSetChanged();
    }


    public interface OnDrawerItemChangeListener {
            public void onDrawerItemChange(EDrawerItem menuItemId, boolean toggleMenu);
    }

}

DrawerAdapter:

public class DrawerAdapter extends BaseAdapter {

    private Context mContext;
    private List<DrawerItem> mItems;
    private int mSelectedIndex;


    public DrawerAdapter(Context context) {
            this.mContext = context;

            List<DrawerItem> items = new ArrayList<>();
            items.add(new DrawerItem(R.drawable.sidemenu_logo, 0));
            items.add(new DrawerItem(R.drawable.sidemenu_calendar_selector, R.string.label_sidemenu_calendar));
            items.add(new DrawerItem(R.drawable.sidemenu_documents_selector, R.string.label_sidemenu_documents));
            items.add(new DrawerItem(R.drawable.sidemenu_contacts_selector, R.string.label_sidemenu_contacts));
            this.mItems = items;
    }


    @Override
    public int getCount() {
            return mItems.size();
    }


    @Override
    public DrawerItem getItem(int position) {
            return mItems.get(position);
    }


    @Override
    public long getItemId(int position) {
            return position;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            if (v == null) {
                    v = LayoutInflater.from(mContext).inflate(R.layout.item_drawer, parent, false);
                    v.setTag(new ViewHolder(v));
            }

            DrawerItem item = getItem(position);

            ViewHolder vh = (ViewHolder) v.getTag();
            vh.content.setBackgroundResource(item.icon);
            vh.content.setSelected(position == mSelectedIndex);

            boolean hasName = item.name != 0;
            if (hasName)
                    vh.text1.setText(item.name);
            vh.text1.setVisibility(hasName ? View.VISIBLE : View.GONE);

            return v;
    }


    public static class DrawerItem {

            public DrawerItem(int icon, int name) {
                    this.icon = icon;
                    this.name = name;
            }


            int icon;
            int name;
    }

    static class ViewHolder {
            @InjectView(android.R.id.text1)
            TextView text1;
            @InjectView(android.R.id.content)
            FrameLayout content;


            ViewHolder(View view) {
                    ButterKnife.inject(this, view);
            }
    }


    public void setSelectedIndex(int i) {
            this.mSelectedIndex = i;
    }

}

My problem is I want change the bg color of my navdrawer in onClick method of my StartFragment.

any idea?

Thx

1 Answer

Any idea??