- 活动(Activity)
1.创建活动:
活动(Activity)是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序中可以包含零个或多个活动
右击com.example.activitytest包→New→Activity→Empty Activity,会弹出一个创建活动的对话框,我们将活动命名为FirstActivity,并且不要勾选Generate File和Launcher Activity这两个选项,
public class FirstActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
}
}
2.创建布局
Android程序的设计讲究逻辑和视图分离,最好每一个活动都能对应一个布局,布局就是用来显示界面内容的,因此我们现在就来手动创建一个布局文件。 右击app/src/main/res目录→New→Directory,会弹出一个新建目录的窗口,这里先创建一个名为layout的目录。然后对着layout目录右键→New→Layout resource file,又会弹出一个新建布局资源文件的窗口,我们将这个布局文件命名为first_layout
3.为活动设置布局
setContentView(R.layout.first_layout);
4.注册活动
所有的活动都要在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" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN"></action> <category android:name="android.intent.category.LAUNCHER"></category> </intent-filter> </activity> </application> </manifest>
5.销毁活动:
finish();
- 布局上的按钮响应事件:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(FirstActivity.this, "Button被点击", Toast.LENGTH_LONG)
.show();
}
});
}
- 在活动中创建菜单:
1. 创建菜单:
首先在res目录下新建一个menu文件夹,右击res目录→New→Directory,输入文件夹名menu,点击OK。接着在这个文件夹下再新建一个名叫main的菜单文件,右击menu文件夹→New→Menu resource file,输入main作为菜单文件名,
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:title="@string/additem" android:id="@+id/add_item"/> <item android:title="@string/removeItem" android:id="@+id/remove_item"/> </menu>
2.添加菜单:
在 Activity 类中, 按住快捷方式【Ctrl+O】,选择要重构的方法 【onCreateOptionsMenu】:
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; }
- getMenuInflater()方法能够得到MenuInflater对象,再调用它的inflate()方法就可以给当前活动创建菜单了。
- inflate()方法接收两个参数,
第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main。
第二个参数用于指定我们的菜单项将添加到哪一个Menu对象当中,
- 这里直接使用onCreateOptionsMenu()方法中传入的menu参数。
然后给这个方法返回true,表示允许创建的菜单显示出来,如果返回了false,创建的菜单将无法显示。
3.菜单响应事件:
按住快捷方式【Ctrl+O】,选择要重构的方法 【onOptionsItemSelected】:
@Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { int itemId = item.getItemId(); switch (itemId) { case R.id.add_item: Toast.makeText(this, "添加", Toast.LENGTH_LONG).show(); Log.d("itemClick","添加"); break; case R.id.remove_item: Toast.makeText(this, "删除", Toast.LENGTH_LONG).show(); Log.d("itemClick","删除"); break; default: Toast.makeText(this, "无效点击", Toast.LENGTH_LONG).show(); Log.d("itemClick","无效点击"); break; } return true;
}
- 使用Intent在活动之间穿梭
不管你想创建多少个活动,方法都和上一节中介绍的是一样的。
唯一的问题在于,你在启动器中点击应用的图标只会进入到该应用的主活动,
那么怎样才能由主活动跳转到其他活动呢?
右击com.example.activitytest包→New→Activity→Empty Activity,
会弹出一个创建活动的对话框,我们这次将活动命名为SecondActivity,
并勾选Generate Layout File,给布局文件起名为second_layout,
但不要勾选Launcher Activity选项
AndroidManifest.xml 自动注册了SecondActivity:
<activity android:name=".SecondActivity"></activity>
由于SecondActivity不是主活动,因此不需要配置<intent-filter>标签里的内容,注册活动的代码也简单了许多。
第二个活动已经创建完成,剩下的问题就是如何去启动这第二个活动了,这里我们需要引入一个新的概念:Intent。
Intent
Intent是Android程序中各组件之间进行交互的一种重要方式,
它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。
Intent一般可被用于启动活动、启动服务以及发送广播等场景,由于服务、广播等
显式Intent:
修改FirstActivity中按钮的点击事件
Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivity(intent);
单击FirstActivity中的按钮,启动SecondActivity这个活动了。如果你想要回到上一个活动怎么办呢?很简单,按下Back键就可以销毁当前活动,从而回到上一个活动了。
隐式Intent:
指定了一系列更为抽象的action 和 category等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动去启动。
在 AndroidManifest.xm 修改SecondActivity:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.Xyz_Shuibian"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
修改FirstActivity中按钮的点击事件:
/* Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
*/
Intent intent2 = new Intent("com.example.activitytest.Xyz_Shuibian");
startActivity(intent2);
只有 <action> 和 <category>中的内容同时能够匹配上Intent中指定的action 和 category时,这个活动才能响应该Intent。
android.intent.category.DEFAULT是一种默认的category ,
在调用 startActivity()方法的时候会自动将这个category添加到Intent中。
每个Intent中只能指定一个action,但却能指定多个category。目前我们的Intent中只有一个默认的category,那么现在再来增加一个吧。
在 AndroidManifest.xm 修改SecondActivity:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.Xyz_Shuibian"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<category android:name="com.example.activitytest.Shuibian_category"></category>
</intent-filter>
</activity>
修改FirstActivity中按钮的点击事件:
Intent intent2 = new Intent("com.example.activitytest.Xyz_Shuibian"); intent2.addCategory("com.example.activitytest.Shuibian_category"); startActivity(intent2);
更多的Intent隐式:
使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动。
这使得Android多个应用程序之间的功能共享成为了可能。比如说你的应用程序中需要展示一个网页,这时你没有必要自己去实现一个浏览器(事实上也不太可能),而是只需要调用系统的浏览器来打开这个网页就行了。
修改FirstActivity中按钮点击事件的代码:
Intent intent3 = new Intent(Intent.ACTION_VIEW);
intent3.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent3);
指定了Intent的action 是 Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW
Uri对象,主要用于指定当前Intent正在操作的数据
我们还可以在<intent-filter>标签中再配置一个<data>标签,用于更精确地指定当前活动能够响应什么类型的数据。<data>标签中主要可以配置以下内容
只有 <data>标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能够响应该Intent。
不过一般在<data>标签中都不会指定过多的内容,如上面浏览器示例中,其实只需要指定android:scheme为http,就可以响应所有的http协议的Intent了。
除了http协议外,我们还可以指定很多其他协议,比如
geo表示显示地理位置、
tel表示拨打电话。
下面的代码展示了如何在我们的程序中调用系统拨号界面。
首先指定了Intent的action 是 Intent.ACTION_DIAL,这又是一个Android系统的内置动作。
Intent intent4 = new Intent(Intent.ACTION_DIAL); intent4.setData(Uri.parse("tel:10086")); startActivity(intent4);
然后在data部分指定了协议是tel,号码是10086。重新运行一下程序,在FirstActivity的界面点击一下按钮: