6.0新特性
来源:互联网 发布:工程量计算稿软件 编辑:程序博客网 时间:2024/05/16 03:13
1. 新特性概述
为什么要适配?
- 权限使用改动较大
- 使用新的设计组件
新特性
- 限制App访问权限
- 删除了Apache HTTP client
- 增加Android Pay付费功能。
- 指纹识别,用于设备解锁及Android Pay
- 新增Doze和App standby功能,省电
- 支持USB Type C,可进行更快速的充电
- 设计支持库,新的界面设计规范(design support library)
主要知识点:
- 权限使用
- 设计支持库的使用
2. 权限使用(最重要的新特性)
6.0之前的权限有什么问题:
- 安装时授权过多,用户很少仔细检查每一项权限
- 只能一次性的授权, 捆绑授权
危险权限
https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous
adb shell pm list permissions -d -g
过去:声明了什么权限,就有什么权限
现在:声明了权限,用户还是可以随时关闭,使用的时候需要实时检查用户是否授权
权限处理三步走:
- 检查是否有相关权限
- 如果没有权限,就发起申请
- 在一个回调函数里面处理申请结果
最佳实践:
https://developer.android.com/training/permissions/best-practices.html
- 常用的权限在一启动的时候就申请
- 不常用的延迟申请(在功能被用到的时候实时申请)
- 向用户解释为什么需要这个权限.
- 6.0开始,每一条权限都需要测试开关两种情况下是否都能正常运行
- 用Intent启动其他应用来完成功能.
- 实际场景:(联系人应用,日历,相机,分享)
- 打开应用设置的对话框, 引导用户打开权限:
<code class="java" data-origin="" Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);Uri uri = Uri.fromParts("package", getPackageName(), null);intent.setData(uri);startActivity(intent);
<code class="java" data-origin=""
使用easypermissions简化权限的处理:
<code class="java" data-origin=""
导入依赖
<code class="java" data-origin="" <code data-origin="" compile 'pub.devrel:easypermissions:0.1.9'" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> compile 'pub.devrel:easypermissions:0.1.9'
<code class="java" data-origin=""
<code data-origin="" 使用:
<code class="java" data-origin="" <code data-origin="" <code data-origin="" // 判断权限" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;">// 判断权限EasyPermissions.hasPermissions(this, Manifest.permission.READ_CONTACTS)); // 请求权限:EasyPermissions.requestPermissions(this, "分享照片需要读写联系人的权限", // 向用户说明权限 requestCode, // 申请权限的请求码 Manifest.permission.READ_CONTACTS); // 请求哪些权限 // 实现EasyPermissions.PermissionCallbacks接口
<code class="java" data-origin="" <code data-origin="" <code data-origin="" 3. 设计支持库(design support library) material design
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" (android.support.design.widget)
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" ActonBar
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" AppBar, Toolbar
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" DrawerLayout, NavigationView
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" TabLayout
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" RecyclerView(support-v7), StaggeredGridLayoutManager
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" ViewPager + RecyclerView
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" TabLayout + ViewPager
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" FloatingActionButton, SnackBar
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" CollapsingToolbarLayout
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" TextInputLayout
<code class="java" data-origin="" <code data-origin="" <code data-origin="" 3.1 ActionBar
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" 什么是ActionBar
如何使用ActionBar
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" 引入appcomat-v7依赖
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" 使用主题Theme.AppCompat.Light.DarkActionBar
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" 使用AppCompatActivity,间接继承与FragmentActivity,可兼容到API7
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" 在onCreateOptionsMenu方法中创建menu,在onOptionsItemSelected方法中处理菜单点击事件
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" ActionView, SearchView的使用<code data-origin="" app:actionViewClass="android.support.v7.widget.SearchView"" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> app:actionViewClass="android.support.v7.widget.SearchView"
<code data-origin="" (要用app命名空间,否则SearchView不能被展开)
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code data-origin="" 3.2 toolbar
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" 为什么要用Toolbar替代Actionbar(更加灵活)
是一个导航 + 标题、副标题 + 任意自定义子View + 菜单的结合体
屏幕上下滚动的时候可以被折叠或者展开
如何使用:
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" android studio新建module时,activity选择blank activity,会自动生成toolbar
依赖appcomat-v7,
主题设置:app:popupTheme=”@style/ThemeOverlay.AppCompat.Light”
背景:android:background=”?attr/colorPrimary”
Activity继承AppCompatActivity
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code data-origin="" <code data-origin="" Activity使用无Actionbar的theme: android:theme="@style/AppTheme.NoActionBar"" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> Activity使用无Actionbar的theme: android:theme="@style/AppTheme.NoActionBar" 使用android.support.v7.widget.Toolbar,不要使用android.widget.Toolbar,以兼容6.0之前的代码
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" 在Activity的onCreate方法中调用setSupportActionBar(toolbar);
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" 创建菜单同ActionBar
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" 创建导航按钮:
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code data-origin="" <code data-origin="" actionBar.setDisplayHomeAsUpEnabled(true);" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeAsUpIndicator(R.drawable.ic_menu); //处理导航按钮点击事件: onOptionsItemSelected() { switch (menu.getItemId() { case android.R.id.home: ... } }
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" DrawerLayout, NavigationView
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" xml配置
<android.support.v4.widget.DrawerLayout
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code data-origin="" <code data-origin="" android:layout_width="match_parent"" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" > <!-- 主界面作为第一个子元素--> <include layout="@layout/include_list_viewpager"/> <!-- NavigationView要作为第二个子元素 --> <android.support.design.widget.NavigationView android:layout_width="190dp" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/drawer_header" app:menu="@menu/drawer" />
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" 如何让NavigationView显示?
mDrawerLayout.openDrawer(GravityCompat.START);
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" 设置菜单响应:
navigationView.setNavigationItemSelectedListener()
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" TabLayout
tabs.addTab(tabs.newTab().setText(“第” + i + “页”), i);
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" RecyclerView是support-v7包中的新组件,是一个强大的条目显示组件,
具备回收复用特性,比ListView性能更优,具备ListView,GridView,Gallery等功能于一身
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" 跟ListView一样,需要定义一个ViewHolder,一个Adapter (均是RecyclerView的子类)
Adapter的使用跟ListAdapter或者ArrayAdapter一样,需要做两件事:- 告诉RecyclerView,list item是如何创建的
- 告诉RecyclerView,数据是如何在list item上显示的
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" 定义list view里面每一个列表项的布局文件
- <code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" recyclerView.setAdapter();
recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" ViewPager + RecyclerView
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" TabLayout + ViewPager
TabLayout上面的title是从哪里来的?需要在ViewPager里面定义
tabs.setupWithViewPager(viewPager);
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" 如何让Toolbar可收缩?
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code data-origin="" <code data-origin="" toobar定义属性: app:layout_scrollFlags="scroll|enterAlways"" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> toobar定义属性: app:layout_scrollFlags="scroll|enterAlways" view pager定义属性: app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<code class="java" data-origin=""
<code data-origin="" <code data-origin="" <code data-origin="" FloatingActionButton, SnackBar
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code data-origin="" <code data-origin="" app:layout_anchor="@id/appbar"" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"> app:layout_anchor="@id/appbar" app:layout_anchorGravity="bottom|right"
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code data-origin="" FloatingActionButton
- <code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
作用 显示一个界面的最主要的动作
<code class="java" data-origin=""
<code data-origin=""<code data-origin=""<code data-origin=""| backgroundTint | | 背景的染色颜色
| backgroundTintMode | | 背景的染色模式
| fabSize | | 尺寸
| | normal | 正常
| | mini | 迷你
<code class="java" data-origin=""
<code data-origin=""<code data-origin=""<code data-origin=""Toast
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code data-origin="" SnackBar
<code data-origin=""<code data-origin=""SnackBar
- <code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
作用 介于Toast和Dialog的一种提示信息,用户进行关键操作后可以反悔
- <code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
不同,不是浮出来的,而是挤出来的
- <code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
使用方法
- <code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
显示 SnackBar.make(view, “提示文字”, SnackBar.LENGTH_SHORT).show();
- <code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
可设置显示或隐藏的回调 setCallBack
<code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
可设置点击操作 setAction
<code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
CollapsingToolbarLayout
<code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
<android.support.design.widget.CollapsingToolbarLayout" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"><android.support.design.widget.CollapsingToolbarLayout app:layout_scrollFlags="scroll|exitUntilCollapsed" android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary" > <ImageView android:scaleType="centerCrop" android:fitsSystemWindows="true" app:layout_collapseMode="parallax" <app:layout_collapseMode="parallax" 实现视差滚动,和app:contentScrim="?attr/colorPrimary"属性一起配合使用。 <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:popupTheme="@style/AppTheme.PopupOverlay" app:layout_collapseMode="pin" /> app:layout_collapseMode="pin"来确保Toolbar在view折叠的时候仍然被固定在屏幕的顶部 toolbar收缩时显示title: collapsingToolbar.setTitle("联系人详情"); 此效果依赖于这个属性 <style name="Theme.DesignDemo" parent="Base.Theme.DesignDemo"> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:statusBarColor">@android:color/transparent</item></style>
<code class="java" data-origin="" <code data-origin="" <code data-origin="" <code data-origin="" TextInputLayout
<code data-origin=""<code data-origin=""TextInputLayout
- <code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
作用 包裹EditText,帮助显示Hint和输入字数统计
- <code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
使用
- <code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
在xml中包裹EditText,一个TextInputLayout只能包裹一个Edittext
- <code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
对TextInputLayout或EditText设置hint属性
- <code class="java" data-origin=""
<code data-origin=""
<code data-origin=""
<code data-origin=""
可在代码中对TextInputLayout设置counterEnable/ counterMaxLength
<code class="java" data-origin=""
<code data-origin=""<code data-origin=""<code data-origin=""需要设置样式:
<code class="java" data-origin=""<code data-origin=""<code data-origin=""<code data-origin=""<code data-origin=""<code class="java" data-origin=""<item name="textColorError">@color/design_textinput_error_color_light</item>" style="border-radius: 3px; word-wrap: break-word; border: 0px; padding: 0px 5px; margin: 0px; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: 700; font-size: 1em; letter-spacing: -1px;"><item name="textColorError">@color/design_textinput_error_color_light</item>
<code data-origin=""<code data-origin=""<code data-origin=""
- JDK 6.0 新特性
- C#6.0 新特性
- C# 6.0新特性
- Android 6.0新特性
- Android 6.0新特性
- Android 6.0 新特性
- C#6.0新特性
- c#6.0新特性
- Android 6.0 新特性
- android 6.0 新特性
- Android 6.0新特性
- Android 6.0 新特性
- Android 6.0 新特性
- Android 6.0新特性
- C#6.0新特性
- android 6.0 新特性
- Android 6.0新特性
- 6.0新特性
- wamp,MySQL,perl的联谊之路
- log4j将日志输出到数据库
- 高度不定 垂直居中
- 嵌套动画如何使用
- Java从一个数组指定位置拷贝到另外一个数组的指定位置-新法
- 6.0新特性
- org.apache.jasper.JasperException: Unable to compile class for JSP
- a64-产品化
- onfling()的使用
- Linux常用命令大全
- iOS编码需要注意的几点问题
- iOS中使用PLCrashReporter收集Crash
- HDU1269 迷宫城堡(强连通分量tarjan入门题)
- 搜索最好的 Android 代码——Android开发工具之Codota