活动Activity的常见使用

本文详细介绍了在Android活动中如何使用Toast、Menu、如何销毁活动以及通过Intent实现在活动间的跳转。从创建Toast到自定义Menu,再到通过显式和隐式Intent启动新的Activity,每个步骤都配有详细的代码示例,帮助开发者更好地理解Activity的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、在活动中使用Toast

Toast是Android系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间。

沿用上一章活动Activity的程序。

首先需要定义一个弹出Toast的触发点,正好界面上有个按钮,那就让点击这个按钮的时候弹出一个Toast吧。在onCreate()方法中添加如下代码:

package com.example.activityteset;

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);
        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(FirstActivity.this, "Hello World", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

在活动中,可以通过findViewById()方法获取到在布局文件中定义的元素,这里我们传人R. id. button_1, 来得到按钮的实例,这个值是刚才在first_layout.xml 中通过android:id属性
指定的。findViewById()方法返回的是一个View对象,我们需要向下转型将它转成Button对象。

得到按钮的实例之后,我们通过调用setOnClickListener()方法为按钮注册一个监听器,点击按钮时就会执行监听器中的onClick()方法。因此,弹出Tast的功能要在onClick()方法中编写。

Toast的用法非常简单,通过静态方法makeText()创建出一个Toast对象,然后调用show( )将Toast显示出来就可以了。

这里需要注意的是,makeText()方法需要传入3个参数。第一个参数是Context,也就是Toast要求的上下文,由于活动本身就是一个Context对象,因此这里直接传人FirstActivity. this即可。第二个参数是Toast显示的文本内容,第三个参数是Toast
显示的时长,有两个内置常量可以选择Toast. LENGTH_ SHORT 和Toast . LENGTH LONG。

运行程序,效果如下:
在这里插入图片描述

二、在活动中使用Menu

手机毕竟和电脑不同,它的屏幕空间非常有限,因此充分地利用屏幕空间在手机界面设计中就显得非常重要了。

如果活动中有大量的菜单需要显示,这个时候界面设计就会比较尴尬,因为仅这些菜单就可能占用屏幕将近三分之一的空间,这该怎么办呢?

Android 给我们提供了一种方式,可以让菜单都能得到展示的同时,还能不占用任何屏幕空间。

2.1、第一步

在这里插入图片描述
在这里插入图片描述

2.2、第二步

然后在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>

这里我们创建了两个菜单项,其中标签就是用来创建具体的某一个菜单项, 然后通过android:id给这个菜单项指定一个唯一的标识符,通过android:title给这个菜单项指定一个名称。

2.3、第三步:在FirstActivity中重写onCreateOptionsMenu()方法

重写方法:快捷键:ctrl + o

package com.example.activityteset;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
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 {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(FirstActivity.this, "Hello World", Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main , menu);
        return super.onCreateOptionsMenu(menu);
    }
}

通过getMenuInflater()方法能够得到MenuInflater对象,再调用它的inflate()方法就可以给当前活动创建菜单了。

inflate()方法接收两个参数,第一个参数用于指定我们通过哪
一个资源文件来创建菜单,这里当然传人R.menu. main。第二个参数用于指定我们的菜单项将添加到哪一个Menu对象当中,这里直接使用onCreate0ptionsMenu( )方法中传人的menu参数。

如果这个方法返回true, 表示允许创建的菜单显示出来,如果返回了false, 创建的菜单将无法显示。

2.4、第四步:在FirstActivity中重写onOptionsItemSelected()方法

onOptionsItemSelected()方法,定义菜单响应事件。在FirstActivity中重写:

package com.example.activityteset;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
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 {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(FirstActivity.this, "Hello World", Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main , menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.add_item:
                Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
                break;
            case R.id.remove_item:
                Toast.makeText(this, "You clicked Remove", Toast.LENGTH_SHORT).show();
                break;
            default:
        }
        return super.onOptionsItemSelected(item);
    }
}

2.5、运行程序,效果如下

在这里插入图片描述

三、销毁一个活动

3.1、方法一:

只要按一下Back键就可以销毁当前的活动了。

3.2、方法二:

调用Activity类提供的finish()方法,修改FirstActivity代码如下:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
    }

重新运行程序,这时点击一下按钮,当前的活动就被成功销毁了,效果和按下Back 键是一样的。

四、使用Intent在活动之间跳转

在实际的开发过程中,一个项目不可能只有一个活动,所以活动之间的跳转,是必须要掌握的。

Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。

Intent一般可被用于启动活动、启动服务以及发送广播等场景.

Intent大致可以分为两种:显式Intent 和隐式Intent。

Intent有多个构造函数的重载,其中-一个是Intent (Context packageContext, Class<?>
cls)。这个构造函数接收两个参数,第一个参数Context要求提供一个启动活动的上下文,第二个参数Class则是指定想要启动的目标活动,通过这个构造函数就可以构建出Intent的“意图”。

Activity 类中提供了一个startActivity()方法,这个方法是专门用于启动活动的,它接收一个Intent 参数,这里我们将构建好的Intent 传入startActivity()方法就可以启动目标活动了。

4.1、再次创建一个活动

在这里插入图片描述

4.2、再second_layout.xml布局文件中,添加一个按钮Button 2

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/button_2"
        android:text="Button 2"/>

</LinearLayout>

4.3、使用显示Intent

修改FirstActivity中按钮点击事件代码,如下:

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });
    }

首先构建出了一个Intent, 传人FirstActivity. this作为上下文,传人SecondActivity. class作为目标活动,这样我们的“意图”就非常明显了,即在FirstActivity这个活动的基础上打开SecondActivity这个活动。

然后通过startActivity( )方法来执行这个Intent。

运行程序,在FirstActivity的界面点击一下按钮,效果如下:
在这里插入图片描述
可以看到,我们已经成功启动SecondActivity这个活动了。

如果你想要回到上一个活动,按下Back键就可以销毁当前活动,从而回到上一个活动了。

使用这种方式来启动活动,Intent 的“意图”非常明显,因此我们称之为显式Intent。

4.4、使用隐式Intent

相比于显式Intent,隐式Intent 则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,
并帮我们找出合适的活动去启动。

什么叫作合适的活动呢?简单来说就是可以响应我们这个隐式Intent的活动,那么目前SecondActivity可以响应什么样的隐式Intent 呢?

通过在标签下配置的内容,可以指定当前活动能够响应的action和category,打AndroidManifest.xml,添加如下代码:

        <activity
            android:name=".SecondActivity"
            android:exported="true" >
            <intent-filter>
                <action android:name="com.example.activitytest.ACTION_START"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

在标签中我们指明了当前活动可以响应com. example. activitytest . ACTION_START这个action,而标签则包含了一些附加信息,更精确地指明了当前的活动能够响应的Intent中还可能带有的category。只有和中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent。

修改FirstActivity中按钮的点击事件,代码如下所示:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent("com.example.activitytest.ACTION_START");
                startActivity(intent);
            }
        });
    }

可以看到,我们使用了Intent 的另一个构造函数,直接将action的字符串传了进去,表明我们想要启动能够响应com . example. activitytest . ACTION_ START 这个action的活动。

那前面不是说要和同时匹配上才能响应的吗?怎么没看到哪里有指定category呢?

这是因为android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到Intent中。

重新运行程序,在FirstActivity的界面点击一 下按钮,同样成功启动SecondActivity了。不同的是,这次是使用了隐式Intent 的方式来启动的,说明我们在标签下配置的action和category的内容已经生效了!

每个Intent中只能指定一个action,但却能指定多个category。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值