val button1: Button = findViewById(R.id.button1)
button1.setOnClickListener{
//DO SOMETHING
}
class FirstActivity : AppCompatActivity(), View.OnClickListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.first_layout)
val button1: Button = findViewById(R.id.button1)
button1.setOnClickListener(this)
}
override fun onClick(v: View?) {
when(v?.id){
R.id.button1 ->{
//Toast.makeText(this, "Clicked button 1", Toast.LENGTH_LONG).show()
//do something
}
}
}
}
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id = "@+id/add_item"
android:title="Add"/>
<item
android:title="Remove"
android:id = "@+id/remove_item"/>
menu>
菜单的资源文件,定义菜单项的id
和名字。然后在显示菜单的Activity
中重写onCreateOptionsMenu()
方法。
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main, menu)
return true
}
getMenuInflater()
方法能够得到一个MenuInflater
对象,再调用它的inflate()
方法,就可以给当前Activity
创建菜单了。inflate()
方法第一个参数是菜单的资源文件,第二个指定将菜单创建在哪一个menu
对象中。接下来定义菜单的响应事件,重写onOptionsItemSelected()
方法。
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when(item.itemId){
R.id.add_item->{
Toast.makeText(this, "clicked ADD", Toast.LENGTH_LONG).show()
}
R.id.remove_item->{
Toast.makeText(this, "clicked Remove", Toast.LENGTH_LONG).show()
}
}
return true
}
使用item.itemId
判断是点击了哪一个菜单项。
关闭布局使用finish()
startActivity(intent)
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)
action, category
等信息,系统去分析这个Intent,并帮我们找出合适的Activity去启动。合适的Activity是指在AndroidManifest.xml
的
标签下配置
的内容,可以指定对应Activity能够响应的action
和category
。 <activity
android:name=".SecondActivity"
android:exported="false">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
intent-filter>
activity>
只有
和
中的内容同时匹配Intent中指定的action
和category
时,这个Activity才能响应该Intent。
val intent = Intent("com.example.activitytest.ACTION_START")
intent.addCategory("android.intent.category.DEFAULT")
startActivity(intent)
每个Intent中只能指定一个action
,但能指定多个category
。目前我们的Intent中只有一个默认的category
,调用addCategory()
增加,为了响应需要在.xml文件中说明。
为了向启动的Activity传输数据,Intent提供了一系列的putExtra()方法的重载可以把我们想要传递的数据暂存在Intent中,在启动另一个Activity后,只需要把这些数据从Intent中取出就可以了。比如说FirstActivity中有一个字符串,现在想把这个字符串传递到SecondActivity中:
val intent = Intent("com.example.activitytest.ACTION_START")
intent.addCategory("android.intent.category.DEFAULT")
intent.putExtra("extra_data","Hello new Activity")
startActivity(intent)
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.second_layout)
val btn2: Button = findViewById(R.id.button2)
val extraData = intent.getStringExtra("extra_data")
btn2.setOnClickListener {
Toast.makeText(this, extraData, Toast.LENGTH_LONG).show()
}
}
}
使用registerForActivityResult
方法,具体步骤,在当Activity
中创建一个私有变量。
private lateinit var register: ActivityResultLauncher
然后在onCreat()
函数中添加如下代码:
register = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
if(it.resultCode == RESULT_OK){
val resultData = it.data?.getStringExtra("data_return")//获取数据
Toast.makeText(this, resultData, Toast.LENGTH_LONG).show()
}else{
Toast.makeText(this, "Return Wrong", Toast.LENGTH_LONG).show()
}
}
按钮启动:
btn.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
register.launch(intent)
}
在新打开的Activity中通过按键返回:
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.second_layout)
button2.setOnClickListener{
val intent = Intent()
intent.putExtra("data_return", "Hello FirstActivity")
setResult(RESULT_OK, intent)
finish()
}
}
}
如果不是通过按钮返回而是Back键回到FirstActivity。我们可以通过在SecondActivity中重写onBackPressed()方法来解决这个问题。
override fun onBackPressed() {
val intent = Intent()
intent.putExtra("data_return", "Hello FirstActivity")
setResult(RESULT_OK, intent)
finish()
}