0
点赞
收藏
分享

微信扫一扫

Android Studio开发——menu,intent,finish

编程练习生J 2022-04-14 阅读 41
kotlin

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
 

举报

相关推荐

0 条评论