我有一个我正在编写的应用程序,它已经包含了很多代码,我决定要在主活动工具栏中添加导航抽屉,但我不知道如何在不创建新的导航抽屉项目的情况下进行复制我的整个项目似乎很多工作,是否有一个教程将导航抽屉添加到现有项目?
创建一个布局layout_left_menu.xml:
在自定义视图中对其进行充气:
public class SimpleLeftMenuView extends NavigationView { private LayoutInflater mInflater; private Context mContext; private ListView mItemsList; private MenuItemsAdapter mItemsAdapter; private ProgressBar mProgress; private OnClickMenu mListener; private ImageView mHeader; private TextView userName; private TextView userEmail; //region Constructors public SimpleLeftMenuView(Context context) { super(context); mContext = context; mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); initLayout(); setData(); } public SimpleLeftMenuView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); initLayout(); setData(); } public SimpleLeftMenuView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mContext = context; mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); initLayout(); setData(); } //endregion private void initLayout(){ mInflater.inflate(R.layout.layout_left_menu, this); mItemsList = (ListView) findViewById(R.id.menu_items_list); mProgress = (ProgressBar) findViewById(R.id.progress); mHeader = (ImageView) findViewById(R.id.header); userName = (TextView) findViewById(R.id.userName); userEmail = (TextView) findViewById(R.id.userEmail); mHeader.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // do something } }); } public void setSelectedSection(String idSection) { mItemsAdapter.setLastSelectedSection(idSection); } public void setmListener(OnClickMenu mListener) { this.mListener = mListener; } private void setData() { Listsections = new ArrayList<>(); sections.add(mContext.getString(R.string.home_id)); sections.add(mContext.getString(R.string.login_id)); sections.add(mContext.getString(R.string.settings_id)); //......... //sections.add(mContext.getString(R.string.exit_id)); mItemsAdapter = new MenuItemsAdapter(mContext, sections, new OnClickMenu() { @Override public void onClick(String id) { mItemsAdapter.setLastSelectedSection(id); if (mListener != null) mListener.onClick(id); } }); mItemsList.setAdapter(mItemsAdapter); mItemsList.setSelection(0); mItemsList.setItemChecked(0, true); } }
您必须创建MenuItemAdapter。
public class MenuItemsAdapter extends BaseAdapter { private Context mContext; private static String lastSelectedSection; private ListmSections; private int currentTextcolor; private OnClickMenu mListener; public MenuItemsAdapter(Context context, List sections, OnClickMenu listener) { mContext = context; mSections = sections; mListener = listener; lastSelectedSection = sections.get(0); } @Override public int getCount() { return mSections.size(); } @Override public String getItem(int position) { return mSections.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { return getCustomView(position, convertView, parent); } public View getCustomView(final int position, View convertView, ViewGroup parent) { final MenuItemHolder holder; if (convertView==null){ LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); convertView = inflater.inflate(R.layout.layout_left_menu_item, parent, false); holder = new MenuItemHolder(convertView); convertView.setTag(holder); }else { holder = (MenuItemHolder) convertView.getTag(); } Resources r = mContext.getResources(); int pxMarginSection = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, r.getDisplayMetrics()); holder.position = position; holder.mLine.setVisibility(View.GONE); holder.mTitle.setTextColor(mContext.getResources().getColor(R.color.primary)); holder.mIconView.setColorFilter(mContext.getResources().getColor(R.color.primary)); if (mSections.get(position).equals(mContext.getString(R.string.login_id))) { holder.mIconView.setImageResource(R.drawable.ic_login_gp); // holder.mIconView.setColorFilter(mContext.getResources().getColor(R.color.primary)); holder.mTitle.setText(mContext.getString(R.string.action_login)); holder.mLine.setVisibility(View.VISIBLE); holder.mLayoutItem.setPadding(0, pxMarginSection, 0, pxMarginSection); } else if (mSections.get(position).equals(mContext.getString(R.string.settings_id))) { holder.mIconView.setImageResource(R.drawable.option); holder.mTitle.setText(mContext.getString(R.string.action_settings)); holder.mLayoutItem.setPadding(0, pxMarginSection, 0, pxMarginSection); holder.mLine.setVisibility(View.VISIBLE); } else if (mSections.get(position).equals(mContext.getString(R.string.exit_id))) { holder.mIconView.setImageResource(R.drawable.shutdown); holder.mTitle.setText(mContext.getString(R.string.salir)); holder.mLayoutItem.setPadding(0, pxMarginSection, 0, pxMarginSection); holder.mLine.setVisibility(View.VISIBLE); } holder.mLayoutItem.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getActionMasked()){ case MotionEvent.ACTION_DOWN: currentTextcolor = holder.mTitle.getCurrentTextColor(); holder.mLayoutItemSelect.setBackgroundColor(mContext.getResources().getColor(R.color.primary)); holder.mTitle.setTextColor(mContext.getResources().getColor(R.color.text_info)); holder.mIconView.setColorFilter(mContext.getResources().getColor(R.color.text_info)); return true; case MotionEvent.ACTION_UP: holder.mLayoutItemSelect.setBackgroundResource(R.color.bgLeftMenu); holder.mTitle.setTextColor(currentTextcolor); holder.mIconView.setColorFilter(mContext.getResources().getColor(R.color.primary)); mListener.onClick(mSections.get(position)); return true; case MotionEvent.ACTION_CANCEL: holder.mLayoutItemSelect.setBackgroundColor(mContext.getResources().getColor(R.color.bgLeftMenu)); holder.mTitle.setTextColor(currentTextcolor); holder.mIconView.setColorFilter(mContext.getResources().getColor(R.color.primary)); return true; } return false; } }); return convertView; } class MenuItemHolder { // butterKnife View view; @Bind(R.id.title) TextView mTitle; @Bind(R.id.icon) ImageView mIconView; @Bind(R.id.layoutItem) LinearLayout mLayoutItem; @Bind (R.id.rl_line) View mLine; @Bind(R.id.layoutItemSelect) LinearLayout mLayoutItemSelect; int position; public MenuItemHolder(View itemView) { ButterKnife.bind(this, itemView); view = itemView; } } public void setLastSelectedSection(String idSection) { lastSelectedSection = idSection; } }
现在,您必须修改当前的活动:
更改您的主要活动布局以使用DrawerLayout并添加自定义视图“ SimpleLeftMenuView”:
// YOUR CURRENT LAYOUT
活动课:
添加全局变量:
protected @Bind(R.id.navigation_view) SimpleLeftMenuView mLeftMenuView; protected @Bind(R.id.drawerLayout) DrawerLayout mDrawerLayout;
设置onclick监听器。您可以根据ID进行操作:
mLeftMenuView.setmListener(new OnClickMenu() { @Override public void onClick(String id) { Log.d("MENU", "ic_menu_hamburger clicked: " + id); closeDrawer(null); if (id.equals(getString(R.string.settings_id))) { Intent intent = new Intent(MainActivity.this, SettingsActivity.class); MainActivity.this.startActivity(intent); } else if (id.equals(getString(R.string.exit_id))) { // salir showRateDialogBeforeExit(); } } });
我创建了自己的界面OnClickMenu:
public interface OnClickMenu { void onClick(String id); }
并添加操作以从菜单图标打开抽屉:
@Override public void onBackPressed() { if((mDrawerLayout) != null && (mDrawerLayout.isDrawerOpen(GravityCompat.START))) closeDrawer(null); else { super.onBackPressed(); } } public void closeDrawer(DrawerLayout.DrawerListener listener) { mDrawerLayout.setDrawerListener(listener); mDrawerLayout.closeDrawers(); } public void openDrawer() { mDrawerLayout.setDrawerListener(null); mDrawerLayout.openDrawer(GravityCompat.START); }
菜单:
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_home, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: openDrawer(); return true; } return super.onOptionsItemSelected(item); }
添加到应用程序build.gradle
compile 'com.android.support:design:26.0.0' compile 'com.jakewharton:butterknife:8.6.0'
将所有@Bind更改为@BindView