为应用条增加动作

大多数应用中都可能会为应用条增加动作,动作是应用条中的一些按钮或文本,可以单击它们来做一些事情。
这里为应用条增加一个创建订单的按钮,单击这个按钮时,将会启动一个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);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值