目录
1、什么是Activity
Activity 是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序中可以包含零个或多个 Activity 。
2、创建Activity
打开Android Studio,点击File -> New -> New Project
-> 选中Empty Activity -> next
-> 给项目命名 -> 点击 Finish
观察一下项目结构,
Android 程序的设计讲究逻辑和视图分离,最好每一个 Activity 都能对应一个布局,布局是用来显示界面内容的。layout 目录下的 activity_main.xml 就是 MainActivity 对应的布局。
Design 是当前的可视化布局编辑器,不仅可以预览当前的布局,还可以通过拖放的方式编辑布局,而 Code 则是通过 XML 文件的方式来编辑布局的,点击一下 Code;
项目中的任何 Activity 都应该重写 onCreate( ) 方法,目前 MainActivity 中已经重写了,这是 Android Studio 自动帮我们完成的。setContentView( )方法给当前的 Activity 加载一个布局,一般传入一个布局文件的 id,项目中添加的任何资源都会在 R 文件中生成一个相应的资源 id。
所有的 Activity 都要在 AndroidManifest.xml 中进行注册才能生效。 Android Studio 自动完成了对 MainActivity 的注册,打开 app/src/main/AndroidManifest.xml;
Activity 的注册声明要放在<application> 标签内,通过<activity>标签来对 Activity 进行注册,android:name 来指定注册哪一个 Activity。程序配置主 Activity 配置的方法就是在<activity>标签的内部加入<intent-filter>标签,并在这个标签里添加<action android:name="android.intent.action.MAIN"/>和<category android:name="android.intent.category.LUANCHR"/>这两句声明即可。
除此之外,还可以使用 android:label 指定 Activity 中标题栏的内容,给主 Activity 指定的 label 不仅会成为标题栏的内容,还会成为启动器(Launtcher)中应用程序显示的名称。
<activity
android:name=".MainActivity"
android:label="This is MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
tip:如果你的应用程序中没有声明任何一个 Activity 作为主 Activity ,这个程序仍然是可以正常安装的,只是你无法在启动器中看到或者打开这个程序。这种程序一般是作为第三方服务供给其他应用在内部进行调用的。
3、启动模拟器运行项目
由于Android Studio自动生成了很多东西,所以现在项目已经直接可以运行。在运行前需要创建一个Android模拟器。
①点击右侧Device Manager,然后点击Create device,选择Phone以及Pixel2,点击next。
②选择之前要先下载,然后点击next,取一个名字AVD Name,(可以按需求修改一些配置)点击Finish,就创建好了。
③点击运行
4、Activity 的基本用法
(1)在 Activity 中使用 Toast
Toast 是 Android 系统提供的一种非常好的提醒方式,在程序中可由使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间。
①打开 activity_main.xml,将根元素改成 LinearLayout ,删除 TextView ,在里面添加一个按钮;
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 1"/>
</LinearLayout>
②打开 MainActivity ,将按钮的点击事件作为 Toast 的触发点
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// findViewById()方法返回的是一个继承自View的泛型对象
val button1 : Button = findViewById(R.id.button1)
// 注册一个监听器,点击按钮是就会执行监听器中的 onClick()方法
button1.setOnClickListener {
Toast.makeText(this,"You clicked Button 1",Toast.LENGTH_SHORT).show()
}
}
}
③运行项目,点击界面上的按钮
使用Kotlin编写的Android项目在app/build.gradle文件的头部默认引入了一个kotlin-android-extension插件,这个插件会根据布局文件中定义的控件id自动生成一个具有相同名称的变量,我们可以在Activity里直接使用这个变量,而不再调用findViewById( )方法了。
在Android Studio4.1以前我们新建kotlin项目ide会自动给我们引入该插件的引用,但是4.1以后就不再默认引入了,这个时候如果想再使用该插件,需要手动引入。
打开app/build.gradle文件,在plugins下添加如下代码:(添加完后点击 Sync now)
id 'kotlin-android-extensions'
现在 MainActivity 中的代码可以简化为:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button1.setOnClickListener {
Toast.makeText(this,"You clicked Button 1",Toast.LENGTH_SHORT).show()
}
}
}
(2)在 Activity 中使用 Menu
① 在res目录下新建一个menu文件夹,res -> New -> Dirctory -> 命名"menu" -> ok
② 右键menu文件夹 -> New -> Menu resource file -> 命名为"main"
③ 在main.xml中添加代码
id属性是给菜单项指定唯一的标识符,创建了两个菜单项
android:title 给这个菜单项指定一个名称
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>
</menu>
④ 回到 MainActivity 重写 onCreateOptionMenu( ) 方法,将菜单显示出来(Ctrl + O)
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button1.setOnClickListener {
Toast.makeText(this,"You clicked Button 1",Toast.LENGTH_SHORT).show()
}
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
/* menuInflater实际上调用了父类的getMenuInflate()方法
得到一个MenuInflater对象,再调用inflate()方法
两个参数,第一个用于指定我们通过哪一个资源文件来创建菜单
第二个用于指定我们的菜单项得添加到那一个Menu对象中
返回true表示允许创建的菜单显示出来
*/
menuInflater.inflate(R.menu.main,menu)
return true
}
}
⑤ 定义菜单响应事件,在 MainActivity 中重写onOptionsItemSelected( )方法
override fun onOptionsItemSelected(item: MenuItem): Boolean {
//语法糖:item.getItemId()
when(item.itemId){
R.id.add_item -> Toast.makeText(this,"You clicked Add",Toast.LENGTH_SHORT).show()
R.id.remove_item -> Toast.makeText(this,"You clicked Remove",Toast.LENGTH_SHORT).show()
}
return true
}
⑥ 运行项目,点击模拟器右上角的三个竖点,点击Add 或 Remove会弹出对应的 Toast
(3)销毁一个 Activity
① 按一下 Back 键就可以销毁当前的 Activity
② Activity 类提供了一个 finish( )方法,调用一下就可以销毁当前的 Activity
// 点击一下按钮,当前的 Activity 就被成功销毁了 和按下 Back 键的效果是一样的
button1.setOnClickListner{
finish()
}