技术标签: NavigationView ActionBarDrawerToggl android Android
此安卓支持库中需要讲解的第二个View就是NavigationView,相信大家在开发中经常会用到抽屉,那么谷歌也为大家提供了这个功能,并不需要去Github去下载使用开源的软件。NavigationView基本满足日常开发抽屉的所有要求,且效率也高。下面我们看下效果图后,将详细介绍其使用方式。
NavigationView完整包名+类名如下:android.support.design.widget.NavigationView
而DrawerLayout完整包名+类名如:android.support.v4.widget.DrawerLayout
其两者搭配起来的XML布局文件如下:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:id="@+id/drawerlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:fitsSystemWindows="true">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"/>
</android.support.design.widget.AppBarLayout>
<LinearLayout
android:id="@+id/linearlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"/>
</LinearLayout>
<android.support.design.widget.NavigationView
android:id="@+id/navigation"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:menu="@menu/drawer_menu"/>
</android.support.v4.widget.DrawerLayout>
属性解释如下:
①android:fitsSystemWindows="true":此属性在标题栏与抽屉中都设置了,保证系统状态栏与抽屉和标题一体化,因为我的测试手机是小米IS,Andorid 4.1的系统,该功能在5.0以上的手机才能显示其效果,故此测试图没有效果。
②app:headerLayout="@layout/drawer_header"也就是下图的区域:
这里在一般APP中都放的头像,我们这里只是做介绍,只要要drawer_header写你的任意布局,那么在此区域就会显示你所需要的界面。
③app:menu="@menu/drawer_menu":也就是下图所示区域:
也就是抽屉中的各种菜单选项。
在res/menu文件下新建drawer_menu.xml文件,写入如下代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/lyj_menu_datou"
android:icon="@drawable/blog_tag_parent_expert"
android:checked="true"
android:title="我是大头"/>
<item
android:id="@+id/lyj_menu_xiaotou"
android:icon="@drawable/blog_tag_parent_honorary_expert"
android:title="我是小头"/>
<item
android:id="@+id/lyj_menu_chilun"
android:icon="@drawable/blog_tag_parent_system_maintenance"
android:title="我是齿轮"/>
</group>
<item android:title="其他">
<menu>
<item
android:icon="@drawable/blog_tag_parent_cloud_computing"
android:title="我是云盘"/>
<item
android:icon="@drawable/blog_tag_parent_comprehensive"
android:title="我是标签"/>
</menu>
</item>
</menu>
属性解释如下:
①android:checkableBehavior="single":代表group所有菜单中,只能一次选择一个。
②android:checked="true":默认选中菜单项,此处为“我是大头”
③<item android:title="其他">:通过子菜单的形式,可以显示分割线与子标题
在继承自AppCompatActivity的Activity中,将标题栏设置显示为如下方式:
Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
toolbar.setTitle("我是大头");
setSupportActionBar(toolbar);
那么将抽屉与标题栏关联要用到ActionBarDrawerToggle。其构造方法有五个参数,按顺序依次如下:
㈠上下文
㈡DrawerLayout
㈢toolbar
㈣打开标识
㈤关闭标识
四与五不显示,仅做标识用。关联抽屉与标题栏代码如下:
DrawerLayout drawerLayout=(DrawerLayout)findViewById(R.id.drawerlayout);
ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar,
R.string.drawer_open, R.string.drawer_close);
mDrawerToggle.syncState();//初始化状态
drawerLayout.setDrawerListener(mDrawerToggle);
使用setDrawerListener方式设置监听开关的打开与关闭。这样就实现了当按下菜单栏左侧按钮的时候,抽屉会打开。
该View给我们提供了菜单的监听回调方法:
setNavigationItemSelectedListener其需要实现的接口如下:
public interface OnNavigationItemSelectedListener {
boolean onNavigationItemSelected(MenuItem var1);
}
接口方法就一个,且参数就是菜单。下面我将实现其监听:
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
switch (menuItem.getItemId()){//获取菜单itemID
case R.id.lyj_menu_datou:
getSupportFragmentManager().beginTransaction().replace(R.id.linearlayout,new DrawerFragment("我是大头")).commit();
toolbar.setTitle("我是大头");
break;
case R.id.lyj_menu_xiaotou:
getSupportFragmentManager().beginTransaction().replace(R.id.linearlayout,new DrawerFragment("我是小头")).commit();
toolbar.setTitle("我是小头");
break;
case R.id.lyj_menu_chilun:
getSupportFragmentManager().beginTransaction().replace(R.id.linearlayout,new DrawerFragment("我是齿轮")).commit();
toolbar.setTitle("我是齿轮");
break;
default:
break;
}
menuItem.setChecked(true);//设置菜单选中
drawerLayout.closeDrawers();//当选中菜单后,就要关闭抽屉
return false;
}
});
根据菜单ID,设置fragment界面。最后效果图,就是博文开始的图片。
5.导入支持库
昨天讲解忘记了,需要配置如下信息,方能使用控件:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:design:23.0.1'
compile 'com.android.support:recyclerview-v7:23.0.1'
compile 'com.android.support:cardview-v7:23.0.1'
}
红色标记为导入的代码。
安装qrcodehttps://pypi.org/project/qrcode/pip install qrcode简单用法import qrcodeimg = qrcode.make('https://blog.csdn.net/ternence_hsu')img.save('output.jpg')效果:复杂用法import qrcodeqr = qrcode.QRC...
什么是单元测试
中间件是一种装配到应用管道以处理请求和响应的软件。 每个组件: 1.选择是否将请求传递到管道中的下一个组件。 2.可在管道中的下一个组件前后执行工作。请求委托用于生成请求管道。 请求委托处理每个 HTTP 请求。使用 RunMap 和 Use 扩展方法来配置请求委托。 可将一个单独的请求委托并行指定为匿名方法(称为并行中间件),或在可重用的类中对其进行定义。 这些可重用的类和并行匿...
Java 中15种锁的介绍 1,在读很多并发文章中,会提及各种各样的锁,如公平锁,乐观锁,下面是对各种锁的总结归纳:公平锁/非公平锁 可重入锁/不可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁 上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。一,公平锁/非公平锁 公平锁:公平锁是指多个线程按照申请锁的顺序来获取...
Input:-webkit-input-placeholder{ ...Style } textarea:-webkit-textarea-placeholder{ ...Style}
窗口大小改变市echarts图表常常会溢出,这时候会很难看,于是查看文档和百度下后,有如下解决方案: var myChart = echarts.init(document.getElementById('main')); var option = { ... }; myChart.setOption(option); window.onresize=function(){...
当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台将xml字符串转换为xml文档时报错,从而导致程序错误。【mybatis可以使用】SQL代码]]>例如:select a1.xml_blob as xmlBlobfrom (select t.xml_blob, rownum rnfrom (s...
最近项目中需要实现两组图片对比,并能将两者的区别标识出来。在网上搜索一大堆找到一篇大神的文章,最终实现该功能,在这里记录下:想要实现此demo,首先我们得确保电脑上已安装 openCV 和 Python 两个工具以及scikit-image和imutils两个库:安装方法,在这里不多说,我安装的是Python3.6 和openCV2,安装方法网上自行百度谷歌;进入正题:新建一个新的Python文件并
自动驾驶:https://selfdrivingcars.mit.edu/python全栈工程师博客:https://anshengme.github.io/blog/http://www.cnblogs.com/linhaifeng/articles/6129246.htmlhttp://www.cnblogs.com/alex3714/articles/5830365.html...
大部分的 Unix/Linux 系统都使用 syslog 作为系统日志方式,AIX 也支持 syslog 机制,但是 AIX 操作系统及其主要应用程序相关的日志都使用 Error log 来记录日志,只有少量的应用程序使用 syslog。AIX syslog 和 Linux syslog 的功能以及配置非常类似,在此不再重复论述。AIX Error log 机制是 AIX 基本系统 (Base
正确答案:详见左边【渝粤教育】公众号_______服务器会自动把域名地址解析为IP地址。A.HTTPB.DNSC.FTPD.SMTP______包括体积、 存储容量、 输入输出能力。A.计算机处理数据的方式B.计算机的规模和处理能力C.计算机的使用范围D.计算机使用的电子器件______包括体积、 存储容量、...
当我们在使用TestNG时,发现它有一个非常好用的参数化功能。当你的测试用例有固定的参数和断言结果时,它可以相似用例的节省用例的个数。例子如下:import static org.testng.Assert.assertEquals;import org.testng.annotations.DataProvider;import org.testng.annotations.Test;/*** ...