1.menu
//Menu提供了一种机制,可以让界面中的菜单项在默认情况下不显示。
//只有当用户主动点击了菜单按钮时,才会弹出里面具体的内容,因此它不会占用任何Activity的空间。
override fun onCreateOptionsMenu(menu: Menu?): Boolean {//撤销ctrl+Z
menuInflater.inflate(R.menu.main,menu)//inflate()方法接收两个参数:第一个参数用于指定我们通过哪一个资源文件来创建菜单,
// 这里当然是传入R.menu.main;第二个参数用于指定我们的菜单项将添加到哪一个Menu对象当中,这里直接使用onCreateOptionsMenu()方法中传入的menu参数。
// 最后给这个方法返回true,表示允许创建的菜单显示出来,如果返回了false,创建的菜单将无法显示。
//我们刚才在onCreateOptionsMenu()方法中编写的menuInflater就使用了这种语法糖,它实际上是调用了父类的getMenuInflater()方法。
// getMenuInflater()方法能够得到一个MenuInflater对象,再调用它的inflate()方法,就可以给当前Activity创建菜单了。
return true//这三句话重写menu的操作方法onCreateOptionsMenu(menu: Menu?): Boolean
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {// 菜单显示出来是不够的,我们定义菜单不仅是为了看的,关键是要菜单真正可用才行
// ,因此还要再定义菜单响应事件。在FirstActivity中重写onOptionsItemSelected()方法
// onOptionsItemSelected()方法中,我们通过调用item.itemId来判断点击的是哪一个菜单项。
when(item.itemId){
R.id.add_item -> Toast.makeText(this,"您点击了这个选项(add)",Toast.LENGTH_SHORT).show()
R.id.remove_item -> Toast.makeText(this,"您点击了这个选项(remove)",Toast.LENGTH_SHORT).show()
R.id.test_item -> Toast.makeText(this,"您点击了这个选项(test)",Toast.LENGTH_SHORT).show()
}
return true
}
}
实例如下:
2.finish
binding.button2.setOnClickListener {
finish()//菜单显示出来是不够的,我们定义菜单不仅是为了看的,关键是要菜单真正可用才行,因此还要再定义菜单响应事件。
// 在FirstActivity中重写onOptionsItemSelected()方法 ,
//onOptionsItemSelected()方法中,我们通过调用item.itemId来判断点击的是哪一个菜单项。
}
3.intent
//Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。
// Intent一般可用于启动Activity、启动Service以及发送广播等场景,由于Service、广播等概念你暂时还未涉及,
//Intent大致可以分为两种:显式Intent和隐式Intent。我们先来看一下显式Intent如何使用。
//Intent有多个构造函数的重载,其中一个是Intent(Context packageContext, Class<?> cls)。
// 这个构造函数接收两个参数:第一个参数Context要求提供一个启动Activity的上下文;第二个参数Class用于指定想要启动的目标Activity,
// 通过这个构造函数就可以构建出Intent的“意图”。那么接下来我们应该怎么使用这个Intent呢?Activity类中提供了一个startActivity()方法,
// 专门用于启动Activity,它接收一个Intent参数,这里我们将构建好的Intent传入startActivity()方法就可以启动目标Activity了。
val intent=Intent(this,SecondActivity::class.java)//显式intent
//相比于显式Intent,隐式Intent则含蓄了许多,它并不明确指出想要启动哪一个Activity,
// 而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮我们找出合适的Activity去启动。
//通过在<activity>标签下配置<intent-filter>的内容,可以指定当前Activity能够响应的action和category,
// 打开AndroidManifest.xml,添加如下代码:
//<activity android:name=".SecondActivity" >
// <intent-filter>
// <action android:name="com.example.activitytest.ACTION_START" />
// <category android:name="android.intent.category.DEFAULT" />
// </intent-filter>
// </activity>
//在<action>标签中我们指明了当前Activity可以响应com.example.activitytest.ACTION_START这个action,
// 而<category>标签则包含了一些附加信息,更精确地指明了当前Activity能够响应的Intent中还可能带有的category。
// 只有<action>和<category>中的内容同时匹配Intent中指定的action和category时,这个Activity才能响应该Intent。
val intent1=Intent("com.example.activitytest.ACTION_START")//隐式intent
intent1.addCategory("com.example.activitytest.MY_CATEGORY")//通过addCategory,可以自定义一个categroy
//要去Androidmanifest.xml文件中,加 <category android:name="com.example.activitytest.MY_CATEGORY" />,否则系统崩溃
startActivity(intent1)
}
但要在打开AndroidManifest.xml,添加如下代码
<activity
android:name=".SecondActivity"
android:exported="true"
android:label="第二界面">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.activitytest.MY_CATEGORY" />
</intent-filter>
</activity>
4.intent .scheme
binding.button4.setOnClickListener {
val intent=Intent(Intent.ACTION_VIEW)
intent.data= Uri.parse("https://www.baidu.com")//还可以启动其他程序的Activity,这就使多个应用程序之间的功能共享成为了可能。
// 比如你的应用程序中需要展示一个网页,这时你没有必要自己去实现一个浏览器(事实上也不太可能),只需要调用系统的浏览器来打开这个网页就行了
//这里我们首先指定了Intent的action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW。
// 然后通过Uri.parse()方法将一个网址字符串解析成一个Uri对象,再调用Intent的setData()方法将这个Uri对象传递进去。
startActivity(intent)
}
但要在打开AndroidManifest.xml,添加如下代码,
<activity
android:name=".ThridActivity"
android:exported="true"
android:label="第三界面">
<intent-filter
tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="https"/>
</intent-filter >
</activity>
我们还可以在<intent-filter>标签中再配置一个<data>标签,用于更精确地指定当前Activity能够响应的数据。<data>标签中主要可以配置以下内容。
● android:scheme。用于指定数据的协议部分,如上例中的https部分。
● android:host。用于指定数据的主机名部分,如上例中的www.baidu.com部分。
● android:port。用于指定数据的端口部分,一般紧随在主机名之后。
● android:path。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
● android:mimeType。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
只有当<data>标签中指定的内容和Intent中携带的Data完全一致时,当前Activity才能够响应该Intent。不过,在<data>标签中一般不会指定过多的内容。例如在上面的浏览器示例中,其实只需要指定android:scheme为https,就可以响应所有https协议的Intent了。
ThirdActivity的<intent-filter>中配置了当前Activity能够响应的action是Intent.ACTION_VIEW的常量值,而category则毫无疑问地指定了默认的category值,另外在<data>标签中,我们通过android:scheme指定了数据的协议必须是https协议,这样ThirdActivity应该就和浏览器一样,能够响应一个打开网页的Intent了。另外,由于Android Studio认为所有能够响应ACTION_VIEW的Activity都应该加上BROWSABLE的category,否则就会给出一段警告提醒。加上BROWSABLE的category是为了实现deep link功能,和我们目前学习的东西无关,所以这里直接在<intent-filter>标签上使用tools:ignore属性将警告忽略即可。
系统自动弹出了一个列表,显示了目前能够响应这个Intent的所有程序。选择Chrome还会像之前一样打开浏览器,并显示百度的主页,而如果选择了ActivityTest,则会启动ThirdActivity。JUST ONCE表示只是这次使用选择的程序打开,ALWAYS则表示以后一直使用这次选择的程序打开。需要注意的是,虽然我们声明了ThirdActivity是可以响应打开网页的Intent的,但实际上这个Activity并没有加载并显示网页的功能,所以在真正的项目中尽量不要出现这种有可能误导用户的行为,不然会让用户对我们的应用产生负面的印象。
binding.button6.setOnClickListener {
val intent=Intent(Intent.ACTION_DIAL)
intent.data= Uri.parse("tel:10086")//打电话设置
startActivity(intent)
}
除了https协议外,我们还可以指定很多其他协议,比如geo表示显示地理位置、tel表示拨打电话。
首先指定了Intent的action是Intent.ACTION_DIAL,这又是一个Android系统的内置动作。然后在data部分指定了协议是tel,号码是10086