知乎是一个我比较喜欢的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