仿知乎程序(一)DrawerLayout与Toolbar
来源:互联网 发布:linux ftp服务 编辑:程序博客网 时间:2024/06/18 05:41
知乎是一个我比较喜欢的app,里面的内容也很好。因为自己在学习Android,所以就想仿一下,看一下自己能不能实现。做了半个月,大体上实现了一下其中的功能,下面是简单的操作,(不要注意细节 - -|||)
是不是已经很像了。里面的数据是调用远程数据库中的数据,没有在手机中使用本地数据库。做程序累所以找了一些不让自己累的数据。哇哈哈。。。。。。
下面我就一步一步的把我做的每一个过程记录下来,算是对学习 android的一个笔记吧。
这里使用了android 5.0的一些控件,所以SDK我升级到了22。也许有人会说,这样是不是有一些低版本的手机就使用不了呢,这些新的控件官方说明是兼容到2.1。所以我感觉这个应该不是问题。
好了,我们先把一进来的首页架起来。这里面使用了Toolbar控件,DrawerLayout控件。
为什么使用toolbar而不使用 actionBar 呢。这里面有两个原因,一是google说toolbar是取代actionbar的,而且比 actionbar更灵活。另一个,看到左上角哪个可动的图标了吗,用toolbar可以直接就实现了,不用第三方插件了。
DrawerLayout的使用,主要是为了,可以从左侧拉出菜单来。
下面我就一步一步的把这个实现出来。
先来看一下activity_main.xml文件:
- <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/drawer_main"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
- <!--toolbar菜单-->
- <include
- layout="@layout/toolbar" />
- <!-- 内容界面 -->
- <FrameLayout
- android:id="@+id/frame_main"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
- </LinearLayout>
- <!-- 侧滑菜单内容 -->
- <fragment
- android:id="@+id/navigation_drawer"
- android:name="com.example.cg.zhihu_one.tool_NavigationDrawerFragment"
- android:layout_width="240dp"
- android:layout_height="match_parent"
- android:layout_gravity="start" />
- </android.support.v4.widget.DrawerLayout>
知识点:
1,android.support.v4.widget.DrawerLayout:这个是google官方的侧滑菜单控件,它内部分为两个部分,一个是内容部分,另一个侧滑菜单内容。使用很简单,也很方便。但是它有一个问题,说是问题,只是与以前我们自己写的侧滑菜单不同的地方,就是它在侧滑的时候,你的手要放到很靠近手机边的地方,而不是说,在手机屏的正中间,你滑一下,它也会显示侧滑,这种设计,个人感觉还是不错的,因为它可以很好的,就把内部再有滑动的效果给区分开了,我们在里面加一个viewpager,你在侧滑的时候,就会造成想切换viewpager的时候,没切成,反而显示了侧滑菜单。
这里我把DrawerLayout做为根控件来使用,是因为我要让侧滑菜单,在滑出来的时候,高度是手机屏幕的高,如果你看DrawerLayout的官方文档,你会发现,它侧滑出来的,是在toolbar下面。这是因为它在Drawerlayout外层还有一个根布局。
注:对于DrawerLayout,其实它是可以左右都有滑出功能的,这一点大家要注意,因为我们这个系统只有一个左侧滑,所以我就用了一个。如果感兴趣,可以试一下,再加一个fragment在下面,但是要注意一点,android:layout_gravity这个值,是用来提供是左滑还是右滑的,里面的值是left|start就是左侧出,right|end就是右侧出。
2,toolbar: 因为后面还要有页使用,所以为了方便,就做成一个文件,然后include调用了。代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:id="@+id/toolbar"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="?attr/colorPrimary"
- android:minHeight="?attr/actionBarSize"
- app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
- app:theme="@style/ThemeOverlay.AppCompat.ActionBar">
- </android.support.v7.widget.Toolbar>
这里要说明的,就是我们要在style.css文件中为toolbar设置相应的样式。代码如下:
- <resources>
- <style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
- <!-- toolbar(actionbar)颜色 -->
- <item name="colorPrimary">@color/titleBlue</item>
- <!-- 状态栏颜色 -->
- <item name="colorPrimaryDark">#3A5FCD</item>
- <!--toolbar文字的颜色-->
- <item name="@android:textColorPrimary">@android:color/white</item>
- <!-- 窗口的背景颜色 -->
- <item name="android:windowBackground">@android:color/white</item>
- <!--toolbar上菜单文字的颜色-->
- <item name="actionMenuTextColor">#ffffff</item>
- </style>
- </resources>
样式加完,我们在AndroidManifest.xml中添加此样式
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppBaseTheme" >
fragment_main_drawer.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:background="#ffffff">
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="0dp"
- android:layout_weight="2"
- android:orientation="vertical"
- android:background="#3A5FCD">
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="0dp"
- android:layout_weight="3">
- <com.example.cg.zhihu_one.untils.CircleImageView
- android:layout_width="50dp"
- android:layout_height="50dp"
- android:layout_margin="10dp"
- android:src="@drawable/img_empty_followers"
- app:border_width="1dp"
- app:border_color="@color/white"
- ></com.example.cg.zhihu_one.untils.CircleImageView>
- </LinearLayout>
- <TextView
- android:id="@+id/txt_main_drawer_UserNick"
- android:layout_width="fill_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:text="我本无名"
- android:textColor="#ffffff"
- android:layout_marginTop="10dp"
- android:layout_marginLeft="10dp"/>
- <TextView
- android:id="@+id/txt_main_drawer_UserProfile"
- android:layout_width="fill_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:text="码农"
- android:textSize="@dimen/main_drawer_small"
- android:textColor="#ffffff"
- android:layout_marginTop="5dp"
- android:layout_marginLeft="10dp"/>
- </LinearLayout>
- <ListView
- android:id="@+id/lv_main_drawer_leftmenu"
- android:layout_width="fill_parent"
- android:layout_height="0dp"
- android:layout_weight="6"
- android:background="#fff"
- android:choiceMode="singleChoice"
- android:layout_marginTop="5dp"
- android:divider="@null"
- android:scrollbars="none"></ListView>
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="0dp"
- android:layout_weight="2"
- android:background="#fff"
- android:layout_marginTop="5dp"
- android:orientation="vertical">
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="0dp"
- android:layout_weight="1">
- <ImageView
- android:layout_width="fill_parent"
- android:layout_height="1dp"
- android:background="@color/grey"/>
- </LinearLayout>
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="0dp"
- android:layout_weight="4"
- android:background="@drawable/main_drawer_background"
- android:clickable="true"
- android:gravity="center_vertical">
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dp"
- android:text="切换主题"
- android:textAppearance="?android:attr/textAppearanceListItemSmall"
- android:textColor="@drawable/main_drawer_text_color"
- />
- </LinearLayout>
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="0dp"
- android:layout_weight="4"
- android:background="@drawable/main_drawer_background"
- android:clickable="true"
- android:gravity="center_vertical">
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dp"
- android:text="设置"
- android:textAppearance="?android:attr/textAppearanceListItemSmall"
- android:textColor="@drawable/main_drawer_text_color"/>
- </LinearLayout>
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="0dp"
- android:layout_weight="1"></LinearLayout>
- </LinearLayout>
- </LinearLayout>
知识点:
1,圆形图:这个不多说,网上有很多现成的例子,这里我把代码复制一下
CircleImageView.java
- import android.content.Context;
- import android.content.res.TypedArray;
- import android.graphics.Bitmap;
- import android.graphics.BitmapShader;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.ColorFilter;
- import android.graphics.Matrix;
- import android.graphics.Paint;
- import android.graphics.RectF;
- import android.graphics.Shader;
- import android.graphics.drawable.BitmapDrawable;
- import android.graphics.drawable.ColorDrawable;
- import android.graphics.drawable.Drawable;
- import android.net.Uri;
- import android.support.annotation.ColorRes;
- import android.support.annotation.DrawableRes;
- import android.util.AttributeSet;
- import android.widget.ImageView;
- import com.example.cg.zhihu_one.R;
- /**
- * Created by cg on 2015/8/26.
- */
- public class CircleImageView extends ImageView {
- private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;
- private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
- private static final int COLORDRAWABLE_DIMENSION = 2;
- private static final int DEFAULT_BORDER_WIDTH = 0;
- private static final int DEFAULT_BORDER_COLOR = Color.BLACK;
- private static final boolean DEFAULT_BORDER_OVERLAY = false;
- private final RectF mDrawableRect = new RectF();
- private final RectF mBorderRect = new RectF();
- private final Matrix mShaderMatrix = new Matrix();
- private final Paint mBitmapPaint = new Paint();
- private final Paint mBorderPaint = new Paint();
- private int mBorderColor = DEFAULT_BORDER_COLOR;
- private int mBorderWidth = DEFAULT_BORDER_WIDTH;
- private Bitmap mBitmap;
- private BitmapShader mBitmapShader;
- private int mBitmapWidth;
- private int mBitmapHeight;
- private float mDrawableRadius;
- private float mBorderRadius;
- private ColorFilter mColorFilter;
- private boolean mReady;
- private boolean mSetupPending;
- private boolean mBorderOverlay;
- public CircleImageView(Context context) {
- super(context);
- init();
- }
- public CircleImageView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
- public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0);
- mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);
- mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR);
- mBorderOverlay = a.getBoolean(R.styleable.CircleImageView_border_overlay, DEFAULT_BORDER_OVERLAY);
- a.recycle();
- init();
- }
- private void init() {
- super.setScaleType(SCALE_TYPE);
- mReady = true;
- if (mSetupPending) {
- setup();
- mSetupPending = false;
- }
- }
- @Override
- public ScaleType getScaleType() {
- return SCALE_TYPE;
- }
- @Override
- public void setScaleType(ScaleType scaleType) {
- if (scaleType != SCALE_TYPE) {
- throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
- }
- }
- @Override
- public void setAdjustViewBounds(boolean adjustViewBounds) {
- if (adjustViewBounds) {
- throw new IllegalArgumentException("adjustViewBounds not supported.");
- }
- }
- @Override
- protected void onDraw(Canvas canvas) {
- if (getDrawable() == null) {
- return;
- }
- canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);
- if (mBorderWidth != 0) {
- canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);
- }
- }
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- super.onSizeChanged(w, h, oldw, oldh);
- setup();
- }
- public int getBorderColor() {
- return mBorderColor;
- }
- public void setBorderColor(int borderColor) {
- if (borderColor == mBorderColor) {
- return;
- }
- mBorderColor = borderColor;
- mBorderPaint.setColor(mBorderColor);
- invalidate();
- }
- public void setBorderColorResource(@ColorRes int borderColorRes) {
- setBorderColor(getContext().getResources().getColor(borderColorRes));
- }
- public int getBorderWidth() {
- return mBorderWidth;
- }
- public void setBorderWidth(int borderWidth) {
- if (borderWidth == mBorderWidth) {
- return;
- }
- mBorderWidth = borderWidth;
- setup();
- }
- public boolean isBorderOverlay() {
- return mBorderOverlay;
- }
- public void setBorderOverlay(boolean borderOverlay) {
- if (borderOverlay == mBorderOverlay) {
- return;
- }
- mBorderOverlay = borderOverlay;
- setup();
- }
- @Override
- public void setImageBitmap(Bitmap bm) {
- super.setImageBitmap(bm);
- mBitmap = bm;
- setup();
- }
- @Override
- public void setImageDrawable(Drawable drawable) {
- super.setImageDrawable(drawable);
- mBitmap = getBitmapFromDrawable(drawable);
- setup();
- }
- @Override
- public void setImageResource(@DrawableRes int resId) {
- super.setImageResource(resId);
- mBitmap = getBitmapFromDrawable(getDrawable());
- setup();
- }
- @Override
- public void setImageURI(Uri uri) {
- super.setImageURI(uri);
- mBitmap = getBitmapFromDrawable(getDrawable());
- setup();
- }
- @Override
- public void setColorFilter(ColorFilter cf) {
- if (cf == mColorFilter) {
- return;
- }
- mColorFilter = cf;
- mBitmapPaint.setColorFilter(mColorFilter);
- invalidate();
- }
- private Bitmap getBitmapFromDrawable(Drawable drawable) {
- if (drawable == null) {
- return null;
- }
- if (drawable instanceof BitmapDrawable) {
- return ((BitmapDrawable) drawable).getBitmap();
- }
- try {
- Bitmap bitmap;
- if (drawable instanceof ColorDrawable) {
- bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
- } else {
- bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
- }
- Canvas canvas = new Canvas(bitmap);
- drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
- drawable.draw(canvas);
- return bitmap;
- } catch (OutOfMemoryError e) {
- return null;
- }
- }
- private void setup() {
- if (!mReady) {
- mSetupPending = true;
- return;
- }
- if (mBitmap == null) {
- return;
- }
- mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
- mBitmapPaint.setAntiAlias(true);
- mBitmapPaint.setShader(mBitmapShader);
- mBorderPaint.setStyle(Paint.Style.STROKE);
- mBorderPaint.setAntiAlias(true);
- mBorderPaint.setColor(mBorderColor);
- mBorderPaint.setStrokeWidth(mBorderWidth);
- mBitmapHeight = mBitmap.getHeight();
- mBitmapWidth = mBitmap.getWidth();
- mBorderRect.set(0, 0, getWidth(), getHeight());
- mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);
- mDrawableRect.set(mBorderRect);
- if (!mBorderOverlay) {
- mDrawableRect.inset(mBorderWidth, mBorderWidth);
- }
- mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);
- updateShaderMatrix();
- invalidate();
- }
- private void updateShaderMatrix() {
- float scale;
- float dx = 0;
- float dy = 0;
- mShaderMatrix.set(null);
- if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {
- scale = mDrawableRect.height() / (float) mBitmapHeight;
- dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
- } else {
- scale = mDrawableRect.width() / (float) mBitmapWidth;
- dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
- }
- mShaderMatrix.setScale(scale, scale);
- mShaderMatrix.postTranslate((int) (dx + 0.5f) + mDrawableRect.left, (int) (dy + 0.5f) + mDrawableRect.top);
- mBitmapShader.setLocalMatrix(mShaderMatrix);
- }
- }
控件中自定义了几个属性,在values文件夹里,建attrs.xml文件文件,代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <declare-styleable name="CircleImageView">
- <attr name="border_width" format="dimension" />
- <attr name="border_color" format="color" />
- <attr name="border_overlay" format="boolean" />
- </declare-styleable>
- </resources>
2,菜单使用listView,代码如下:listview中的item页面代码:
fragment_main_drawer_item.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:padding="16dp"
- android:gravity="center_vertical"
- android:background="@drawable/main_drawer_background"
- android:orientation="horizontal">
- <ImageView
- android:id="@+id/item_icon"
- android:layout_marginRight="10dp"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <TextView
- android:id="@+id/item_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceListItemSmall"
- android:textColor="@drawable/main_drawer_text_color"
- android:gravity="center_vertical"
- />
- </LinearLayout>
这里面的android:background="@drawable/main_drawer_background"主要是在点击菜单时,改变背景色
main_drawer_background.xml
- <?xml version="1.0" encoding="utf-8"?>
- <selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:state_activated="true"
- android:drawable="@color/grey" />
- <item
- android:state_focused="false"
- android:state_pressed="true"
- android:drawable="@color/grey" />
- <item android:drawable="@android:color/transparent" />
- </selector>
main_drawer_text_color.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_enabled="false"
android:color="#ff999999"/>
<item
android:state_activated="true"
android:color="@android:color/white" />
<item
android:color="#636363" /></selector>
现在item已经有了,哪么我们就为这个菜单列表写一个adapter
Main_Drawer_lv_Adapter.java
- import android.content.Context;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.ImageView;
- import android.widget.TextView;
- import com.example.cg.zhihu_one.R;
- import com.example.cg.zhihu_one.models.MainDrawerMenu;
- import java.util.List;
- /**
- * 左侧侧滑菜单的adpter
- * Created by cg on 2015/10/26.
- */
- public class Main_Drawer_lv_Adapter extends BaseAdapter {
- private LayoutInflater inflater;
- private List<MainDrawerMenu> list_menu; //菜单名称与图标的list,采用了一个类
- public Main_Drawer_lv_Adapter(Context context,List<MainDrawerMenu> list_menu) {
- inflater = LayoutInflater.from(context);
- this.list_menu = list_menu;
- }
- @Override
- public int getCount() {
- return list_menu.size();
- }
- @Override
- public Object getItem(int position) {
- return list_menu.get(position);
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- menuItem mItem;
- if(convertView==null)
- {
- convertView = inflater.inflate(R.layout.fragment_main_drawer_item,null);
- mItem = new menuItem();
- mItem.icon = (ImageView)convertView.findViewById(R.id.item_icon);
- mItem.title = (TextView)convertView.findViewById(R.id.item_title);
- convertView.setTag(mItem);
- }else{
- mItem = (menuItem)convertView.getTag();
- }
- mItem.icon.setImageResource(list_menu.get(position).getMainDrawer_icon());
- mItem.title.setText(list_menu.get(position).getMainDrawer_menuName());
- return convertView;
- }
- public class menuItem
- {
- ImageView icon;
- TextView title;
- }
- }
这里面为了将图标和文字传入,我建立了一个model类。MainDrawerMenu.java
- /**
- * 左侧侧滑菜单内容类
- * Created by cg on 2015/10/23.
- */
- public class MainDrawerMenu {
- private int mainDrawer_icon; //菜单的图标
- private String mainDrawer_menuName; //菜单的名称
- public MainDrawerMenu() {
- }
- public MainDrawerMenu(int mainDrawer_icon, String mainDrawer_menuName) {
- this.mainDrawer_icon = mainDrawer_icon;
- this.mainDrawer_menuName = mainDrawer_menuName;
- }
- /**
- * 得到菜单图标
- * @return
- */
- public int getMainDrawer_icon() {
- return mainDrawer_icon;
- }
- /**
- * 设置菜单图标
- * @param mainDrawer_icon
- */
- public void setMainDrawer_icon(int mainDrawer_icon) {
- this.mainDrawer_icon = mainDrawer_icon;
- }
- /**
- * 得到菜单名称
- * @return
- */
- public String getMainDrawer_menuName() {
- return mainDrawer_menuName;
- }
- /**
- * 设置菜单名称
- * @param mainDrawer_menuName
- */
- public void setMainDrawer_menuName(String mainDrawer_menuName) {
- this.mainDrawer_menuName = mainDrawer_menuName;
- }
- }
现在布局有了,圆形图搞定,listview的item布局和adapter也完事了,下面就把这些整合起来吧.tool_NavigationDrawerFragment.java
- import android.app.Fragment;
- import android.content.res.TypedArray;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.AdapterView;
- import android.widget.ListView;
- import com.example.cg.zhihu_one.Adapters.Main_Drawer_lv_Adapter;
- import com.example.cg.zhihu_one.models.MainDrawerMenu;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * 左侧侧滑页面
- * Created by cg on 2015/10/23.
- */
- public class tool_NavigationDrawerFragment extends Fragment {
- private ListView lv_main_drawer_leftmenu; //定义菜单的listView
- private List<MainDrawerMenu> list_menu;
- /**
- * 设置菜单点击接口,以方便外部Activity调用
- */
- public interface menuClickListener
- {
- void menuClick(String menuName);
- }
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.fragment_main_drawer,container,false);
- initleftMenuContral(view);
- return view;
- }
- /**
- * 初始化左侧菜单列表listView,并为菜单,设置点击事件
- * @param view
- */
- private void initleftMenuContral(View view) {
- lv_main_drawer_leftmenu = (ListView)view.findViewById(R.id.lv_main_drawer_leftmenu);
- list_menu = getMenuItem();
- lv_main_drawer_leftmenu.setAdapter(new Main_Drawer_lv_Adapter(getActivity(),list_menu));
- lv_main_drawer_leftmenu.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- if(getActivity() instanceof menuClickListener)
- {
- ((menuClickListener)getActivity()).menuClick(list_menu.get(position).getMainDrawer_menuName());
- }
- }
- });
- }
- /**
- * 从arrays.xml中取出数据,装入list<T>中
- * @return
- */
- private List<MainDrawerMenu> getMenuItem()
- {
- List<MainDrawerMenu> list_menu = new ArrayList<MainDrawerMenu>();
- String[] itemTitle = getResources().getStringArray(R.array.item_title);
- TypedArray itemIconRes = getResources().obtainTypedArray(R.array.item_icon_res);
- for(int i=0;i<itemTitle.length;i++)
- {
- MainDrawerMenu lmi = new MainDrawerMenu();
- lmi.setMainDrawer_icon(itemIconRes.getResourceId(i,0));
- lmi.setMainDrawer_menuName(itemTitle[i]);
- list_menu.add(lmi);
- }
- return list_menu;
- }
- }
这里说明一点,这里的菜单名和图标,我采用的是在values文件夹建立了一个arrays.xml文件,把这些值写在了这里。
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string-array name="item_title">
- <item>首页</item>
- <item>发现</item>
- <item>关注</item>
- <item>收藏</item>
- <item>草稿</item>
- <item>提问</item>
- </string-array>
- <integer-array name="item_icon_res">
- <item>@drawable/ic_drawer_home_normal</item>
- <item>@drawable/ic_drawer_explore_normal</item>
- <item>@drawable/ic_drawer_follow_normal</item>
- <item>@drawable/ic_drawer_collect_normal</item>
- <item>@drawable/ic_drawer_draft_normal</item>
- <item>@drawable/ic_drawer_question_normal</item>
- </integer-array>
- </resources>
到这里,我们的toolbar,左侧菜单都已经建立完成了,我们来运行一下看一下效果。
左侧菜单没问题,已经实现了我们的想法,可是这个toolbar上面,处了背景色以外,什么都没有,这是什么情况呢,这是因为我们还没有给toolbar进行设置,好了,我们来看一下MainActivity.java的代码.
- import android.os.Bundle;
- import android.support.v4.widget.DrawerLayout;
- import android.support.v7.app.ActionBarDrawerToggle;
- import android.support.v7.app.AppCompatActivity;
- import android.support.v7.widget.Toolbar;
- import android.view.Menu;
- import android.view.MenuItem;
- public class MainActivity extends AppCompatActivity {
- private Toolbar toolbar; //定义toolbar
- private ActionBarDrawerToggle mDrawerToggle; //定义toolbar左上角的弹出左侧菜单按钮
- private DrawerLayout drawer_main; //定义左侧滑动布局,其实就是主布局
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initToolbar();
- }
- /**
- * 初始化Toolbar,并设置Toolbar中的菜单与标题,并与DrawerLayout.DrawerListener相关联,设置动态图标
- */
- public void initToolbar()
- {
- toolbar = (Toolbar)this.findViewById(R.id.toolbar);
- toolbar.setTitle("首页"); // 标题的文字需在setSupportActionBar之前,不然会无效
- setSupportActionBar(toolbar);
- //为了生成,工具栏左上角的动态图标,要使用下面的方法
- drawer_main = (DrawerLayout) findViewById(R.id.drawer_main);
- mDrawerToggle = new ActionBarDrawerToggle(this, drawer_main, toolbar, R.string.drawer_open,
- R.string.drawer_close);
- mDrawerToggle.syncState();
- drawer_main.setDrawerListener(mDrawerToggle);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.menu_main, menu);
- return true;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // Handle action bar item clicks here. The action bar will
- // automatically handle clicks on the Home/Up button, so long
- // as you specify a parent activity in AndroidManifest.xml.
- int id = item.getItemId();
- //noinspection SimplifiableIfStatement
- if (id == R.id. main_toolbar_shuffle) {
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
- }
这里,我们还要在menu_main.xml中设置在toolbar上的菜单,代码如下:
- <menu xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
- <item
- android:id="@+id/main_toolbar_shuffle"
- android:title="@string/menu_shuffle"
- android:icon="@drawable/ic_action_shuffle"
- app:showAsAction="always" />
- <item
- android:id="@+id/main_toolbar_search"
- android:title="@string/menu_search"
- android:icon="@drawable/ic_action_search"
- app:showAsAction="always"/>
- <item
- android:id="@+id/main_toolbar_notify"
- android:title="@string/menu_notify"
- android:icon="@drawable/ic_action_notify"
- app:showAsAction="always" />
- <item
- android:id="@+id/main_toolbar_about"
- android:title="@string/menu_about"
- app:showAsAction="never" />
- <item
- android:id="@+id/main_toolbar_register"
- android:title="@string/menu_register"
- app:showAsAction="never" />
- </menu>
为了方便我们修改菜单名和可以重复使用,我们把文字放到了strings.xml中
- <string name="menu_index">首页</string>
- <string name="menu_search">查询</string>
- <string name="menu_notify">通知</string>
- <string name="menu_about">关于</string>
- <string name="menu_register">登出</string>
- <string name="menu_share">分享</string>
- <string name="menu_shuffle">随机看</string>
好了,这回我们再运行一下,看一下效果:
转自:http://blog.csdn.net/chenguang79/article/details/49444787
- 仿知乎程序(一)DrawerLayout与Toolbar
- 仿知乎程序(一)DrawerLayout与Toolbar
- DrawerLayout与ToolBar之双宿双飞
- Toolbar与抽屉菜单DrawerLayout
- DrawerLayout,Toolbar
- DrawerLayout + Toolbar
- ToolBar + DrawerLayout
- Drawerlayout Toolbar
- Toolbar+DrawerLayout
- DrawerLayout+ToolBar
- DrawerLayout的学习(与ToolBar结合)
- 使用Toolbar + DrawerLayout+RecyclerView实现侧滑菜单栏(一)
- Android5.0 之 ToolBar与DrawerLayout配合使用
- 【菜鸟学安卓】- DrawerLayout + Toolbar 与主题theme 颜色设置
- Material Design风格侧边栏 DrawerLayout与Toolbar
- Android开发之DrawerLayout与ToolBar之间不得不说的秘密
- 使用Toolbar与DrawerLayout实现侧滑菜单
- DrawerLayout + Toolbar + ViewPager
- 学习记录
- 生日礼物(京东2016实习生真题)
- extjs grid去掉复选框
- 走迷宫——深度优先搜索
- 关于android如何对cookie的读取!
- 仿知乎程序(一)DrawerLayout与Toolbar
- Spring定时任务的几种实现
- C++异常
- Java Word 转 Pdf
- 临时记录
- 关于jsp中验证码在某些浏览器中无法显示的问题
- 传智播客与北京开放大学合作共建互联网+创业教育学院
- mysql workbench中PK,NN,UQ,BIN,UN,ZF,AI字段类型标识说明
- 浅谈UserAgent