活动 Activity 是一种可以包含用户界面的组件,主要用于和用户交互。一个应用程序可以包含零个或多个活动,但不包含任何活动的应用程序很少见。
创建活动
右击com.example.helloworld 包 -> New -> Activity ->Empty Activity 会弹出一个创建活动的对话框,将活动命名为FirstActivity,并且不要勾选Generate Layout File 和 Launcher Activity 这两个选项。
勾选Generate Layout File 表示会自动为FirstActivity 创建一个对应的布局文件,勾选Launcher Activity 表示会自动将 FirstActivity 设置为当前项目的主活动。勾选Backwards Compatibility 表示会为项目启用向下兼容的模式,这个选项要勾上。点击Finish 完成创建。
项目中的任何活动都应该重写Activity 的onCreate 方法,而目前的FirstActivity 中已经重写了这个方法,这是Android Studio 自动完成的。
public class FirstActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState)
}
}
可以看到onCreate()方法非常简单,只是调用了父类的onCreate()方法。这只是默认的实现,后面需要在里面加入自己的逻辑。
Android 程序的设计讲究逻辑和视图分离,最好每个活动都能对应一个布局,布局就是用来显示界面内容的。
右击app/src/main/res 目录 -> New ->Directory,会弹出一个新建目录的窗口,先创建一个名为layout 的目录。然后对着layout 目录右键 -> New -> Layout resource file ,又会弹出一个新建布局资源文件的窗口,将这个布局文件命名为first_layout,根元素就默认选择为LinearLayout。
点击OK完成布局的创建,会看到布局编辑器
这是Android Studio 提供的可视化布局编辑器,可以在屏幕的中央区域预览当前的布局。窗口的最下方有两个切换卡,左边是Design,右边是Text。Design 是当前的可视化布局编辑器,不仅可以预览当前的布局,还可以通过拖放的方式编辑布局。而Text 则是通过XML 文件的方式来编辑布局。点一下Text 切换卡,可以看到如下布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orentation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
由于在创建布局文件时选择了LinearLayout 作为根元素,布局文件中已经有一个LinearLayout 元素了。现在对这个布局稍做编辑,添加一个按钮。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orentation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 1"/>
</LinearLayout>
这里添加了一个Button 元素,并在Button 元素的内部增加了几个属性。android:id 是给当前的元素定义一个唯一标识符,之后可以在代码中对这个元素进行操作。如果需要在XML 中引用一个id,就使用@id/id_name 这种语法,如果需要在XML 中定义一个id,则要使用@+id/id_name 这种语法。android:layout_width 指定了当前元素的宽度,使用match_parent 表示当前元素和父元素一样宽。android:layout_height 指定当前元素的高度,使用wrap_content 表示当前元素的高度只要能刚好包含里面的内容就行。android:text 指定了元素中显示的文字内容。可以通过右侧工具栏的Preview 来预览一下当前布局。
在活动中加载这个布局,重新回到FirstActivity,在onCreate()方法中加入如下代码
public class FirstActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
}
}
这里调用了setContentView()方法,给当前活动加载一个布局,而在setContentView()方法中,一般都会传入一个布局文件的id。项目中添加的任何资源都会在R文件中生成一个相应的资源id,因此刚才创建的first_layout.xml 布局的id 应该是已经添加到R 文件了。
在AndroidManifest 文件中注册。
所有的活动都要在AndroidManifest.xml 中进行注册才能生效。打开 app/src/main/AndroidManifest.xml 文件。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworld">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".FirstActivity"></activity>
</application>
</manifest>
可以看到,活动的注册声明放在<application> 标签内,通过<activity> 标签对活动进行注册。
在<activity> 标签中使用android:name 来指定具体注册哪个活动。.FirstActivity 就是com.example.helloworld.FirstActivity 的缩写。由于在最外层的<manifest> 标签中已经通过package 属性指定了程序的包名是com.example.helloworld,因此在注册活动时,这部分可以省略,直接使用.FirstActivity。
为程序配置主活动
配置主活动的方法就是在<activity> 标签的内部加入<intent-filter> 标签,并在这个标签里添加<action android:name=“android.intent.action.MAIN”/> 和 <category android:name=“android.intent.category.LAUNCHER”/> 这两句声明。
可以使用android:label 指定活动中标题栏的内容,标题栏是显示在活动最顶部的。给主活动指定的label 不仅会成为标题栏中的内容,还会成为启动器(Launcher)中应用程序显示的名称。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworld">
<application
···>
<activity android:name=".FirstActivity"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
如果应用程序中没有声明任何一个活动作为主活动,这个程序仍然是可以正常安装的,只是无法在启动器中看到或者打开这个程序。这种程序一般是作为第三方服务供其它应用在内部进行调用的,如支付宝快捷支付服务。
在界面的最顶部是一个标题栏,标题栏的线就是在布局文件first_layout 中编写的界面。