大多数应用中都可能会为应用条增加动作,动作是应用条中的一些按钮或文本,可以单击它们来做一些事情。
这里为应用条增加一个创建订单的按钮,单击这个按钮时,将会启动一个OrderActivity的新活动。
创建一个新活动名为OrderActivity,其布局名为activity_order。该布局使用和MainActivity中相同的布局。activity_order代码如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".OrderActivity">
<include
layout="@layout/toolbar_main"
android:id = "@+id/toolbar"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
更新OrderActivity.java
package com.hfad.bitsandpizzas;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.os.Bundle;
public class OrderActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_order);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
}
为活动的标题在string.xml中增加一个字符串资源
<string name="create_order">Create Order</string>
增加标签来改变应用条文本
修改AndroidManifest.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.BitsAndPizzas"
tools:targetApi="31">
<activity
android:name=".OrderActivity"
android:label="@string/create_order"
android:exported="false" />
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
其中主要增加了两个android:label标签,其主要告知Android应用条中显示什么文本。
为应用条增加动作的步骤
1、为动作增加图标和文本资源
2、在菜单资源文件中定义动作(这会告诉Android你希望应用条上有哪些动作)
3、让活动将这个菜单资源增加到应用条(为此要实现onCreateOptionsMenu方法)
4、增加代码,指定单击时要完成哪个动作(为此要实现onOptionsItemSelected方法)
一、增加动作的资源
https://dogriffiths.github.io/HeadFirstAndroid/resources/bitsandpizzas.zip
在上面的链接中下载图标,将其添加到AS工程的drawable-hdpi,drawable-mdpi,drawable-xhdpi, drawable-xxxhdpi文件夹中,没有这些文件夹就创建。
将以下代码添加进strings.xml文件中:
<string name="create_order_title">Create Order</string>
二、创建菜单资源文件夹
在AS工程中app/src/main/res/menu中创建一个名为menu_main.xml的新的菜单资源文件夹,所有新的菜单资源文件都放在这个文件夹中,将menu_main.xml文件的内容替换如下:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="@string/create_order_title"
android:id="@+id/action_create_order"
android:icon="@drawable/ic_add_white_24dp"
android:orderInCategory="1"
app:showAsAction="ifRoom" />
</menu>
菜单资源文件有一个menu元素作为它的根元素,其中可以有多个item元素,每个item元素描述一个不同的动作,动作包含很多属性,可以确定这个动作在应用条上如何显示,如它的图标和文本。
控制动作的外观
1、创建应用条上显示一个动作时,很可能把它显示为一个图标,图标可以是任何drawable资源,使用android:icon进行设置。
2、有时候Android无法显示动作的图标,这可能是因为动作没有图标,或因为动作显示在应用条的溢出区而不是主区,所以最好为动作设置一个标题,使得动作可以显示为一小段文本而不是图标。可以使用android:title属性设置动作的标题。
3、如果应用条包含多个动作,你可能希望指定它们出现的顺序。为此,要使用orderInCategorys属性,数值低的动作会在数值高的动作之前显示。
4、最后,shwoAsAction属性用于指示是否希望这一项出现在应用条中。这个属性可以是以下值:
ifRoom:如果有空间,将这个菜单项放在应用条中,如果没有空间,就放在溢出区中。
withText:包含这个菜单项的标题文本。
never:放到溢出区,永远都不放在主应用区。
always:总是把这一项放到主应用条区,这个值要少用,如果很多项都使用这个属性可能会互相重叠。
三、为应用增加菜单
实现MainActivity中的onCreateOptionsMenu方法。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}
实现该方法之后,会把你的菜单资源文件增加到应用条,也就是inflate,这说明它会创建一个menu对象,这是菜单资源文件的一个Java表示,菜单资源文件包含的所有动作会转换为MenuItem。再把这些菜单项增加到应用条。
四、用onOptionsItemSelected方法响应单击动作项
单击应用条上的一个动作时,要让活动做出反应,需要在活动上实现onOptionsItemSelected方法。
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
//MenuItem对象是应用条上所单击的动作。
//根据得到的动作的ID做出相应的动作
switch (item.getItemId()) {
case R.id.action_create_order:
Intent intent = new Intent(this, OrderActivity.class);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
下面是完整的MainActivity:
package com.hfad.bitsandpizzas;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
//MenuItem对象是应用条上所单击的动作。
//根据得到的动作的ID做出相应的动作
switch (item.getItemId()) {
case R.id.action_create_order:
Intent intent = new Intent(this, OrderActivity.class);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}