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 trialFabio Carnicella
8,119 PointsNavigationDrawer 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
Fabio Carnicella
8,119 PointsAny idea??