Android Design Support Library 2015年在Goole I/O大会上提出的,Android Design Support Library 中提出了很多Materail Design 技术。前几天针对这个新的技术库已经写了三个控件了有强大提示的功能的TextInputLayout 悬浮按钮控件Floating action Button 和弹出框 SnackBar 今天研究一下听闻好久的一个新控件 Navigation View 创建导航抽屉。
Navigation的使用
写一个简单的demo来展示navigation的使用
1 首先先引用支持包
compile 'com.android.support:design:25.0.1'
2 布局文件 activity_main
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/dralayout"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="com.navigationview.MainActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/tb_id"
android:layout_width="match_parent"
android:layout_height="40dp"
>
</android.support.v7.widget.Toolbar>
<TextView
android:id="@+id/content_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Hello World!"
/>
</RelativeLayout>
<android.support.design.widget.NavigationView
android:id="@+id/nv_menu"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:layout_gravity="left"
app:headerLayout="@layout/drawablemenu"
app:menu="@menu/menu"
>
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>
其中 app:headerLayout 用于指定一个任意的布局,作为导航抽屉的顶部,如效果图中的粉色带头像的部分。
而 app:menu 用于指定导航抽屉的菜单项,比如listview的列表
drawablemenu 简单的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="192dp"
android:background="@color/colorAccent"
>
<ImageView
android:layout_width="100dp"
android:layout_height="80dp"
android:src="@mipmap/avar"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:id="@+id/imageView"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/avar_name"
android:textColor="@color/bule"
android:textStyle="bold"
android:textSize="18sp"
android:layout_below="@+id/imageView"
android:layout_centerHorizontal="true"/>
</RelativeLayout>
menu的配置文件
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single" >
<item android:id="@+id/item1"
android:icon="@mipmap/itemimg"
android:title="标题1"
>
</item>
<item android:id="@+id/item2"
android:icon="@mipmap/itemimg"
android:title="标题2"
>
</item>
<item android:id="@+id/item3"
android:icon="@mipmap/itemimg"
android:title="标题3"
>
</item>
<item android:id="@+id/item4"
android:icon="@mipmap/itemimg"
android:title="标题4"
>
<menu >
<item android:id="@+id/it_1"
android:title="标题4_1"
>
</item>
<item android:id="@+id/it_2"
android:title="标题4_2"
>
</item>
<item android:id="@+id/it_3"
android:title="标题4_3"
>
</item>
</menu>
</item>
</group>
</menu>
activity:
package com.navigationview;
import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import java.lang.reflect.Method;
/**
* @author 凉菇凉
* @deprecated navigation抽屉的效果
*/
public class MainActivity extends AppCompatActivity {
private DrawerLayout mDrawerLayout;
private Toolbar mToolbar;
private NavigationView mNavigationView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDrawerLayout= (DrawerLayout) findViewById(R.id.dralayout);
mToolbar= (Toolbar) findViewById(R.id.tb_id);
mNavigationView= (NavigationView) findViewById(R.id.nv_menu);
setSupportActionBar(mToolbar);
mToolbar.setTitle("navigation的演示");
mToolbar.setNavigationIcon(R.mipmap.itemimg);
if(mNavigationView!=null){
mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
item.setChecked(true);
mDrawerLayout.closeDrawers();
return true;
}
});
}
}
}
在这个demo中遇到两个问题
一个是menu中设置的icon没有显示图标 。这个问题试了网上的好几种方法还是不行,后期查到补上;
二是引用抽屉的时候没有在配置文件中设置,出现错误
Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT
_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.;
解决办法:
问题原因:
当在activity中调用了setSupportActionBar(toolbar);
当在activity中调用了setSupportActionBar(toolbar);
同时,AndroidManifest.xml 对应的Activity标签的android:theme为
android:theme="@style/AppTheme" >
style资源文件中的parent为
parent="Theme.AppCompat.Light.DarkActionBar
解决办法:
1 在style配置文件中加上
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
或者,将parent改为
parent="Theme.AppCompat.Light.NoActionBar"
2、在AndroidManifest.xml 对应的Activity标签的android:theme引用该style中的修改的主题