note:AppCompact主要用于在较低版本的 Android 系统上恰当地降级,该库可以用于支持material design用户界面交互设计 ,该库已经迁移到androidx
该库主要包含以下4个关键类。
一、ActionBar 导航栏
二、AppCompatActivity 作为activity的基类。
三、AppCompatDialog 窗口
四、ShareActionProvider 第三方分享
1、导航栏,通常情况下我们使用ToolBar来替代ActionBar ,这是因为Toolbar能够兼容更低的版本。
1.1 首先使用Toolbar时必须去掉主题自导的ActionBar。去掉的方式为在style.xml中定义主题,然后再Activity中引用该主题。
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
1.2 在Activity中初始化Toolbar
setSupportActionBar(toolbar)
1.3 用户界面指南描述一个导航栏,应当具有三个要素:
- 一个专用区域,可以标识您的应用并指示用户在应用中的位置。
- 以可预测的方式访问搜索等重要操作。
- 支持导航和视图切换(通过标签页或下拉列表)。
1.3.1 专用区域显示用户在应用中的位置,对应上图“Sheets”区域,通常用于显示该页面的名字。
1.3.2 以可预测的方式访问搜索等重要操作,对应上图的搜索图标和文件访问图标
1.3.3 支持导航和视图切换。就是显示导航或者back返回。
1.3.3.1 搜索menu
1.3.3.1.1 在menu中定义SearchView
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/search"
android:title="@android:string/search_go"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom"/>
</menu>
1.3.3.1.2 控制SearchView
点击返回的时候,search控件不会自动收回,应用会响应返回事件退出界面,这时需要处理返回键。
a 在onCreateOptionsMenu中初始化
search = menu.findItem(R.id.search).actionView as SearchView
b 在 onKeyUp中响应返回键,判定此时搜索按钮的展开状态
when (keyCode) {
KeyEvent.KEYCODE_BACK -> {
//获取searchview的展开状态
val isIconified = search?.isIconified
if (isIconified != null && !isIconified) {
search?.isIconified=true
return true
}
}
}
1.3.3.2 返回键
1.3.3.2.1在初始化Toolbar之后,直接设置以下属性,便可以开启返回键
supportActionBar?.setDisplayHomeAsUpEnabled(true)
1.3.3.2.2响应返回键的点击。在onOptionsItemSelected方法中,监听menu的点击事件。
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when (item?.itemId) {
android.R.id.home -> finish()
}
return super.onOptionsItemSelected(item)
}
2、用作Activity的基类
3、用作Dialog的基类
4、第三方分享包含第三方lib比如mod分享 友盟分享。当不集成第三方包时包含两种方式。
4.1.1定义menu文件
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_share"
app:showAsAction="ifRoom"
android:title="share"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
</menu>
4.1.2 在activity和fragment的onCreateOptionsMenu()中初始化ShareActionProvider
menuInflater.inflate(R.menu.share, menu)
val shareItem = menu?.findItem(R.id.action_share)
val provider = MenuItemCompat.getActionProvider(shareItem) as ShareActionProvider
4.1.3 然后直接发送对应的意图,意图必须指定action为Intent.ACTION_SEND
val shareIntent = Intent(Intent.ACTION_SEND)
shareIntent.type = "image/*"
shareIntent.putExtra(Intent.EXTRA_STREAM, uri)
provider?.setShareIntent(shareIntent)
4.2直接使用androidx的ShareCompat
val shareIntent = ShareCompat.IntentBuilder.from(activity)
.setText(shareText)
.setType("text/plain")
.createChooserIntent()
.apply {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT or Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
} else {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET)
}
}
startActivity(shareIntent)