仿知乎程序(一)DrawerLayout与Toolbar

         知乎是一个我比较喜欢的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" >
我们再来看一下,侧滑菜单的布局与代码。这里说一句啊。正常这个侧滑布局我们应该使用android.support.design.widget.NavigationView,它是google给我们提供的一个官方控件,非常的好用,使用也简单,但是它有几个问题,我一直没有解决,一是,菜单上的图标,不管你用什么色的,显示全是灰的。二是如果你加了<item android:title="Sub items">,它会在一直显示这个title,如果你把这个title去掉,它是不显示这个文字了,可是相应的位置还是被留了出来,空了好大一块,所以这里只好自己去写一个布局。
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://download.csdn.net/detail/chenguang79/9215873

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值