之前博客《Android学习笔记之——Android Studio的安装(3.6版本)、Java的基本语法及Android的概述》介绍过活动是所有Android应用程序的门面,凡是在应用中看得到的东西都是放在活动中的(也即与用户交互,UI)
目录
创建一个新的activity
由于Android Studio在一个工作区间内只允许打开一个项目,因此首先需要将当前的项目关闭,点击导航栏File→Close Project。
然后再新建一个Android项目,在此处,不再选择Empty Activity这个选项,而是选择Add No Activity,因为这次我们准备手动创建活动
项目名可以叫作ActivityTest,包名我们就使用默认值com.example.activitytest
点击Finish,等待Gradle构建完成后,项目就创建成功了。
项目创建成功后,仍然会默认使用Android模式的项目结构,这里手动改成Project模式
虽然Android studio会自动生成很多文件,但是,app/src/main/java/com.example.activitytest目录应该是空的了
现在右击com.example.activitytest包→New→Activity→Empty Activity
将活动命名为FirstActivity,并且不要勾选Generate Layout File和Launcher Activity这两个选项,如下图所示。
- 勾选Generate Layout File表示会自动为FirstActivity创建一个对应的布局文件,
- 勾选Launcher Activity表示会自动将FirstActivity设置为当前项目的主活动,
项目中的任何活动都应该重写Activity的onCreate() 方法,而目前的FirstActivity中已经重写了这个方法,这是由Android Studio自动帮我们完成的,代码如下所示:
package com.example.activitytest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
创建和加载布局
Android程序的设计讲究逻辑和视图分离,最好每一个活动都能对应一个布局,布局就是用来显示界面内容的,因此我们现在就来手动创建一个布局文件。
右击app/src/main/res目录→New→Directory
会弹出一个新建目录的窗口,
这里先创建一个名为layout的目录。然后对着layout目录右键→New→Layout resource file
我们将这个布局文件命名为first_layout,根元素就默认选择为LinearLayout
这是Android Studio为我们提供的可视化布局编辑器,你可以在屏幕的中央区域预览当前的布局。
先来看看text部分
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
由于我们刚才在创建布局文件时选择了LinearLayout作为根元素,因此现在布局文件中已经有一个LinearLayout元素了。那我们现在对这个布局稍做编辑,添加一个按钮,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button_1" //给当前的元素定义一个唯一标识符,之后可以在代码中对这个元素进行操
//如果你需要在XML中引用一个id ,就使用@id/id_name 这种语法
//而如果你需要在XML中定义一个id ,则要使用@+id/id_name 这种语法
android:layout_width="match_parent" //指定了当前元素的宽度(这里选择与父元素一样宽)
android:layout_height="wrap_content" //指定了当前元素的高度(这里表示当前元素的高度只要能刚好包含里面的内容就行)
android:text="Button 1" //元素中显示的文字内容
/>
</LinearLayout>
创建完布局后,在onCreate() 方法中加入如下代码,来加载这个布局:
package com.example.activitytest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//通过文件名字来调用
//setContentView方法用于加载布局
//项目中添加的任何资源都会在R文件中生成一个相应的资源id
// 因此,所创建的layout文件会自动将id添加到R文件中
// 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id
}
}
在AndroidManifest文件中注册
之前博客《Android学习笔记之——Android Studio的安装(3.6版本)、Java的基本语法及Android的概述》介绍过,所有的活动都要在AndroidManifest.xml中进行注册才能生效,而实际上FirstActivity已经在AndroidManifest.xml中注册过了,我们打开app/src/main/AndroidManifest.xml文件,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".FirstActivity"></activity>
</application>
</manifest>
活动的注册声明要放在<application> 标签内,这里是通过<activity> 标签来对活动进行注册的。
在<activity> 标签中我们使用了android:name 来指定具体注册哪一个活动
不过,仅仅是这样注册了活动,我们的程序仍然是不能运行的,因为还没有为程序配置主活动,也就是说,当程序运行起来的时候,不知道要首先启动哪个活动。
将文件修改如下:
- 首先,在<activity> 标签的内部加入<intent-filter> 标签,并在这个标签里添加<action android:name="android.intent.action.MAIN"/> 和<category android: name="android.intent.category.LAUNCHER" /> 这两句声明
- 使用android:label 指定活动中标题栏的内容,标题栏是显示在活动最顶部的。需要注意的是,给主活动指定的label不仅会成为标题栏中的内容,还会成为启动器(Launcher)中应用程序显示的名称。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<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>
这样的话,FirstActivity就成为我们这个程序的主活动了,即点击桌面应用程序图标时首先打开的就是这个活动。另外需要注意,如果你的应用程序中没有声明任何一个活动作为主活动,这个程序仍然是可以正常安装的,只是你无法在启动器中看到或者打开这个程序。这种程序一般都是作为第三方服务供其他应用在内部进行调用的,如支付宝快捷支付服务。
运行“shift+F10”
在活动中使用Toast
Toast是Android系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间。
接下来实现功能为点击button1就会出现toast。在onCreate()中添加如下代码:
package com.example.activitytest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
//setContentView方法用于加载布局
//项目中添加的任何资源都会在R文件中生成一个相应的资源id
// 因此,所创建的layout文件会自动将id添加到R文件中
// 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id
///////////**********************///////////////
Button button1=(Button) findViewById(R.id.button_1);
//通过findViewById() 方法获取到在布局文件中定义的元素
//在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
//findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象
button1.setOnClickListener(new View.OnClickListener() {
//通过调用setOnClickListener() 方法为按钮注册一个监听器
//点击按钮时就会执行监听器中的onClick() 方法。
@Override
public void onClick(View v) {
Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
//通过静态方法makeText() 创建出一个Toast对象
//并通过show()将Toast显示出来
// makeText() 方法需要传入3个参数。
// 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
// 第二个参数是Toast显示的文本内容,
// 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
}
});
}
}
在活动中使用Menu
在大多数的app界面都会有几个点的菜单键。本节介绍一下怎么创建菜单键
首先在res目录下新建一个menu文件夹,右击res目录→New→Directory,输入文件夹名menu,点击OK。
接着在这个文件夹下再新建一个名叫main的菜单文件,右击menu文件夹→New→Menu resource file
然后在main.xml中添加如下代码:
<?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>
然后回到FirstActivity中对onCreateOptionsMenu()方法进行重写。通过输入“ctrl+O”可以启动:
然后将方法重写
package com.example.activitytest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class FirstActivity extends AppCompatActivity {
//重写onCreateOptionsMenu方法,将菜单显示出来
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
//通过getMenuInflater() 方法能够得到MenuInflater 对象
//再调用它的inflate() 方法就可以给当前活动创建菜单了
//inflate() 方法接收两个参数,
//第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main 。
//第二个参数用于指定我们的菜单项将添加到哪一个Menu 对象当中,这里直接使用onCreateOptionsMenu() 方法中传入的menu 参数。
return true;
//返回true ,表示允许创建的菜单显示出来
//若返回了false ,创建的菜单将无法显示。
}
//重写onOptionsItemSelected方法,定义菜单的相应事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){ //通过调用item.getItemId() 来判断我们点击的是哪一个菜单项
case R.id.add_item:
Toast.makeText(FirstActivity.this, "你点了add!",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(FirstActivity.this, "你点了remove!",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
////////////////////////////////////////************************************///////
//定义布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//通过文件名字来调用,加载布局
//setContentView方法用于加载布局
//项目中添加的任何资源都会在R文件中生成一个相应的资源id
// 因此,所创建的layout文件会自动将id添加到R文件中
// 只需要调用R.layout.first_layout 就可以得到first_layout.xml 布局的id
///////////**********************///////////////
Button button1=(Button) findViewById(R.id.button_1);
//通过findViewById() 方法获取到在布局文件中定义的元素
//在first_layout文件中,通过android:id="@+id/button_1"定义了按钮
//findViewById() 方法返回的是一个View 对象,我们需要向下转型将它转成Button 对象
button1.setOnClickListener(new View.OnClickListener() {
//通过调用setOnClickListener() 方法为按钮注册一个监听器
//点击按钮时就会执行监听器中的onClick() 方法。
@Override
public void onClick(View v) {
Toast.makeText(FirstActivity.this, "臭鱼!",Toast.LENGTH_SHORT).show();
//通过静态方法makeText() 创建出一个Toast对象
//并通过show()将Toast显示出来
// makeText() 方法需要传入3个参数。
// 第一个参数是Context ,也就是Toast要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this 即可。
// 第二个参数是Toast显示的文本内容,
// 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
}
});
}
}
然后运行该程序有: