合理组织安卓活动

news2025/1/21 18:48:30

本文所有代码均存放于https://github.com/MADMAX110/Starbuzz
开始构建一个应用时,你会考虑这个应用要包含什么,会有各种各样的很多想法,如何组织这些想法来建立一个直观、清晰的应用。
一、活动归类
要组织各种各样的活动,有一种方法很有效:可以把它们归类为3种不同类型的活动:顶级活动、类别活动和详细信息/编辑活动
顶级活动:括对用户来说最重要的功能,要为用户提供便捷的途径,使他们能轻松地导航到这些功能。在大多是应用中,用户看到的第一个活动就是顶级活动。
类别活动:会显示某个特定类别的数据,通常会显示在一个列表中。这一类活动一般用于帮助用户导航到详细信息/编辑活动。
详细信息/编辑活动:会显示某个特定记录的详细信息,允许用户编辑这个记录,或者可以让用户输入新的记录。
很显然以上三种活动具有明显的层级关系,存在层层调用的关系。

二、构建一个菜单应用
在顶级活动中,包含一个logo,还会显示一个导航列表,其中包括饮料,食物和分店的入口。
在饮料类别活动中,会显示出售的所有饮料的一个清单。用户单击其中一种,可以查看其更多详细信息。
在饮料详细活动中,会显示饮料名,图片及描述。
由此看来,该应用的应用结构已经非常清晰了。包含三个活动,TopLevelActivity使应用的顶级活动,允许用户在应用中导航。DrinkCategoryActivity是一个类别活动,它包含所有饮料的一个列表。而DrinkActivity会显示某种饮料的详细信息。
应用的工作如下:
1、应用启动时,它会启动活动TopLevelActivity。
该活动使用布局activity_top_level.xml。它会显示一个选项列表,其中包括Drinks、Food和Stores。
2、用户单击TopLevelActivity中的Drinks。这会启动DrinkCategoryActivity。
这个活动使用布局activity_drink_category.xml,会显示一个饮料列表。从Drink.java类文件中获得饮料信息。
3、用户单击DrinkCategoryActivity中的饮料,这会启动DrinkActivity。
这个活动使用布局activity_drink.xml,他也从Drink.java类文件获得饮料的详细信息。

三、创建工程
如下图所示,创建一个名为Starbuzz的新的安卓工程。
在这里插入图片描述
工程目录如下:
在这里插入图片描述
其中包括一个Drink类,三个活动,三个布局,以及四张图片。
工程保存图像时,Android会为各个图像指定一个ID,形式为R.drawable.image_name,值是int类型。

四、Drink类
首先是Drink类,这是一个纯Java类,定义了一个包括3中饮料的数组,每种饮料包括饮料名,描述,以及图像资源ID。
Drink.java

package com.hfad.starbuzz;

public class Drink {
    private String name;
    private String description;
    private int imageResourceId;
    //drinks is an array of Drinks
    public static final Drink[] drinks = {
            new Drink("Latte", "A couple of espresso shots with steamed milk", R.drawable.latte),
            new Drink("Cappuccino", "Espresso, hot milk, and a steamed milk foam", R.drawable.cappuccino),
            new Drink("Filter", "Highest quality beans roasted and brewed fresh", R.drawable.filter)
    };

    //Each Drink has a name, description, and an image resource
    private Drink(String name, String description, int imageResourceId) {
        this.name = name;
        this.description = description;
        this.imageResourceId = imageResourceId;
    }

    public String getDescription() {
        return description;
    }

    public String getName() {
        return name;
    }

    public int getImageResourceId() {
        return imageResourceId;
    }

    public String toString() {
        return this.name;
    }
}

五、顶级布局
TopLevelActivity时默认活动,其布局为activity_top_level.xml。顶级布局包含一个图像和一个列表
定义图像视图:

<ImageView
    android:layout_width="200dp"
    android:layout_height="100dp"
    android:src="@drawable/starbuzz_logo"
    android:contentDescription="@string/starbuzz_logo"
    />

在strings.xml中增加字符串

<string name="starbuzz_logo">Starbuzz logo</string>

定义列表视图

    <ListView
        android:id="@+id/list_options"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/options" />

在strings.xml中增加一个字符串数组

    <string-array name="options">
        <item>Drinks</item>
        <item>Food</item>
        <item>Stores</item>
    </string-array>

完整的activity_top_level.xml代码

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

    <ImageView
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:src="@drawable/starbuzz_logo"
        android:contentDescription="@string/starbuzz_logo"
        />

    <ListView
        android:id="@+id/list_options"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/options"
        />
</LinearLayout>

实现效果如图所示:
在这里插入图片描述

六、在顶级活动中利用监听器让列表视图响应单击
可以实现一个事件监听器让列表视图中的列表项响应用户单击。
事件监听器允许你监听应用中发生的事件,例如单击视图、视图得到焦点或失去焦点,或者用户按下设备上的一个按键。通过事件监听器可以对用户某个特定的动作做出响应。
使用OnItemClickListener监听列表项的单击事件
下面是完整的TopActivity.java代码

package com.hfad.starbuzz;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

public class TopLevelActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_top_level);
        //创建监听器
        AdapterView.OnItemClickListener itemClickListener =
                new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        //Drink是列表视图中的第一项,所以位于位置0
                        if (position == 0) {
                            //这个意图来自TopLevelActivity,需要启动DrinkCategoryActivity
                            Intent intent = new Intent(TopLevelActivity.this, DrinkCategoryActivity.class);
                            startActivity(intent);
                        }
                    }
                };
        //为列表视图增加监听器
        ListView listView = (ListView) findViewById(R.id.list_options);
        listView.setOnItemClickListener(itemClickListener);
    }
}

七、类别活动显示一个类别的数据
DrinkCategoryActivity是类别活动的一个例子。类别活动显示属于某个特定类别的数据,通常会显示在一个列表中。可以使用类别活动导航查看数据的详细信息。
需要注意的是:这里不使用android:entries属性,但是这样只能关联一个静态数组。这里我们需要把列表视图关联到Drink类中的drinks数组。
非静态数据要使用适配器
如果要在列表视图中显示数据,而数据来自strings.xml以外的其他数据源(如一个Java数组或数据库),就需要使用适配器。适配器就像数据源和列表视图之间的一座桥。这里主要使用数组适配器。数组适配器可以将数组和视图绑定,可以用于AdapterView类的任何子类,这说明这种适配器也可以用于列表视图和spinner,ArrayAdapter是一种专门用于处理数组的适配器
用数组适配器连接列表视图和数组:

ArrayAdapter<Drink> listAdapter = new ArrayAdapter<>(
                this,
                android.R.layout.simple_list_item_1,
                Drink.drinks);

数组适配器一般有三个参数,一个Context(通常是当前活动),一个布局资源以及数组本身。
然后关联到列表视图

ListView listDrinks = (ListView) findViewById(R.id.list_drinks);
listDrinks.setAdapter(listAdapter);

处理单击事件

AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (position == 0) {
                    Intent intent = new Intent(DrinkCategoryActivity.this, DrinkCategoryActivity.class);
                    startActivity(intent);
                }
            }
        };

将所单击列表项的ID增加到一个意图来传递ID
用类别活动在一个列表视图中显示列表项,通常会使用onItemClick方法启动另一个活动来显示用户单击的列表项的详细信息。为此,要创建一个意图启动第二个活动。然后为意图增加所单击列表项的ID作为额外信息,使得第二个活动启动时可以使用这个信息。在这里我们希望启动DrinkActivity并传入所选择饮料的ID。然后DrinActivity就能使用这个信息显示相应饮料的详细信息了。下面给出意图的代码:

Intent intent = new Intent(DrinkCategoryActivity.this, DrinkActivity.class);
        //向意图增加所单击列表项的ID,第一个参数表示使用这个常量名表示意图中的额外信息名
        //这样就能知道DrinkCategoryActivity和DrinkActivity在使用同一个字符串
        //创建DrinkActivity活动时要增加这个常量。
        intent.putExtra(DrinkActivity.EXTRA_DRINKID, (int)id);
        startActivity(intent);

完整的DrinkCategoryActivity代码

package com.hfad.starbuzz;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class DrinkCategoryActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drink_category);
        ArrayAdapter<Drink> listAdapter = new ArrayAdapter<>(
                this,
                android.R.layout.simple_list_item_1,
                Drink.drinks);
        ListView listDrinks = (ListView) findViewById(R.id.list_drinks);
        listDrinks.setAdapter(listAdapter);

        AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (position == 0) {
                    Intent intent = new Intent(DrinkCategoryActivity.this, DrinkCategoryActivity.class);
                    startActivity(intent);
                }
                Intent intent = new Intent(DrinkCategoryActivity.this, DrinkActivity.class);
                //向意图增加所单击列表项的ID,第一个参数表示使用这个常量名表示意图中的额外信息名
                //这样就能知道DrinkCategoryActivity和DrinkActivity在使用同一个字符串
                //创建DrinkActivity活动时要增加这个常量。
                intent.putExtra(DrinkActivity.EXTRA_DRINKID, (int)id);
                startActivity(intent);
            }
        };

       listDrinks.setOnItemClickListener(itemClickListener);
    }
}

八、详细信息活动显示一个记录的数据
activity_drink.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".DrinkActivity">

    <ImageView
        android:id="@+id/photo"
        android:layout_width="190dp"
        android:layout_height="190dp"/>

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@id/description"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

从意图获取数据
创建DrinkCategoryActivity时,将用户单击的饮料的ID作为额外信息增加到意图。为它指定一个标签DrinkActivity.EXTRA_DRINKID,要在DrinkActivity中把它定义一个常量:

public static final String EXTRA_DRINKID = "drinkId";

从意图中获取EXTRA_DRINKID值

int drinkId = (Integer)getIntent().getExtras().get(EXTRA_DRINKID);

再使用drinkID得到用户选择的饮料的详细信息,drinkID时饮料的ID。也就是drinks数组中这种饮料的索引,这说明可以使用以下代码得到用户单击的饮料:

Drink drink = Drink.drinks[drinkId];

使用数据更新视图

  TextView name = (TextView) findViewById(R.id.name);
        name.setText(drink.getName());

        TextView description = (TextView) findViewById(R.id.description);
        description.setText(drink.getDescription());

        ImageView photo = (ImageView) findViewById(R.id.photo);
        photo.setImageResource(drink.getImageResourceId());
        photo.setContentDescription(drink.getName());

完整的DrinkActivity代码:

package com.hfad.starbuzz;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

public class DrinkActivity extends AppCompatActivity {

    public static final String EXTRA_DRINKID = "drinkId";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drink);

        int drinkId = (Integer)getIntent().getExtras().get(EXTRA_DRINKID);
        Drink drink = Drink.drinks[drinkId];

        TextView name = (TextView) findViewById(R.id.name);
        name.setText(drink.getName());

        TextView description = (TextView) findViewById(R.id.description);
        description.setText(drink.getDescription());

        ImageView photo = (ImageView) findViewById(R.id.photo);
        photo.setImageResource(drink.getImageResourceId());
        photo.setContentDescription(drink.getName());
    }


}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/718658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IMX6ULL移植篇-uboot网络配置工作

一. uboot 网络IP配置 1. 硬件连接 在使用 uboot 的网络功能之前先用网线将开发板的 ENET2 接口和电脑或者路由器连接&#xff0c; I.MX6U-ALPHA 开发板有两个网口&#xff1a; ENET1 和 ENET2 &#xff0c;一定要连接 ENET2 &#xff0c;ENET2 接口如下&#xff1a…

LIS系统源码 基于互联网技术的医院实验室信息管理系统源码

LIS系统&#xff0c;即实验室信息管理系统&#xff0c;是一种基于互联网技术的医疗行业管理系统&#xff0c;它可以帮助实验室进行样本管理、检测流程管理、结果报告等一系列工作&#xff0c;提高实验室工作效率和质量。下面将从LIS系统的功能、特点方面对其进行详细介绍。 一、…

基于深度学习的高精度工人安全帽检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度工人安全帽检测识别系统可用于日常生活中或野外来检测与定位工人安全帽目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的工人安全帽目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用…

docker-compose管理mongo

mongo-express 可以线上管理mongo 库&#xff0c;下面记录一下docker-compose 配置 mongo以及mongo-express version: "3.1"services:mongo:image: mongorestart: alwaysports:- 27017:27017environment:- MONGO_INITDB_ROOT_USERNAMEadmin- MONGO_INITDB_ROOT_PASSW…

【花雕】全国青少年机器人技术一级考试备考实操搭建手册5

目录 1、秋千 2、跷跷板 3、搅拌器 4、奇怪的钟 5、起重机 6、烤肉架 7、手摇风扇 8、履带车 9、直升机 10、后轮驱动车 起重机是指在一定范围内垂直提升和水平搬运重物的多动作起重机械。又称天车&#xff0c;航吊&#xff0c;吊车。 轮胎起重机的主要特点是&#xff1a;其行…

CTFHub XSS DOM跳转 WriteUp

前文&#xff1a;DOM反射XSS 进入网站&#xff0c;直接查看源代码&#xff0c;下面是关键代码&#xff0c;这里有xss漏洞&#xff1a; <script>var target location.search.split("")if (target[0].slice(1) "jumpto") {location.href target[1…

深度解读AIGC存储解决方案

5月26日&#xff0c;2023数据基础设施技术峰会在苏州举办&#xff0c;腾讯云首席存储技术专家温涛受邀出席并分享了腾讯云领先的存储技术在AIGC场景中的应用&#xff0c;通过对AIGC业务流程和场景的提炼&#xff0c;从内容生成、内容审核和内容智理三要素介绍了如何智能的存储和…

你可以对AI中台有所了解

一个AI中台覆盖从数据管理、数据标注、模型开发、部署上线到运营管理的AI能力研发与应用全生命周期建设和管理。作为企业AI能力的生产、应用和集中化管理平台&#xff0c;AI中台包括智能数据、模型开发、模型中心、预测服务、AI集市和平台管理等部分。 智能数据&#xff1a;提供…

基于JavaSpringBoot+Vue+uniapp微信小程序实现鲜花商城购物系统

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

归并排序 与 逆序对数量

一、归并排序 题目&#xff1a; 给定你一个长度为 n 的整数数列&#xff0c;请你使用归并排序对这个数列按照从小到大进行排序&#xff0c;并将排好序的数列按顺序输出。 输入格式&#xff1a; 输入共两行&#xff0c;第一行包含整数 n。 第二行包含 n个整数&#xff08;所有整…

Kubernetes(k8s)入门:核心组件详解

文章目录 写在前面一、ReplicationController(RC)1、官方解释2、举个例子3、小总结 二、ReplicaSet(RS)1、官方解释2、举个例子 三、Deployment&#xff08;用的最多&#xff09;1、官方解释2、举个例子&#xff08;1&#xff09;创建nginx_deployment.yaml文件&#xff08;2&a…

MySQL学习基础篇(七)---单行函数

MySQL学习基础篇(七)—单行函数 1 什么是函数 函数在计算机语言的使用中贯穿始终&#xff0c;函数的作用是什么呢&#xff1f;它可以把我们经常使用的代码封装起来&#xff0c;需要的时候直接调用即可。这样既 提高了代码效率 &#xff0c;又 提高了可维护性 。在 SQL 中我们…

学习笔记整理-UML建模与应用复习4-构架建模

在一个更高的层次描述一个应用系统的结构&#xff0c;包括系统组件和组件之间的关系&#xff0c;组件的部署情况&#xff0c;以及硬件设备之间的关系。 1、组件图 用于描述功能所在的组件位置以及它们之间的关系。 包括&#xff1a;组件、接口、以及各种关系。可以显示…

IAR中Zstack协议栈相关问题解决办法

IAR中Zstack协议栈相关问题解决办法 1、Warning[w52]: More than one definition for the byte at address 0x4b in common segment INTVEC. 如果遇到类似 Warning[w52]: More than one definition for the byte at address 0x4b in common segment INTVEC. It is defined i…

uniapp打包之配置MacOS虚拟机生成iOS打包证书

前言 uniapp是一款跨端开发框架,可用于快速开发iOS、Android、H5等多端应用。本文将详细介绍如何实现uniapp开发的iOS应用打包。 详细步骤 一、下载苹果原版镜像文件 点击此处下载 二、安装VMware uniapp打包iOS应用需要生成相应证书和P2文件&#xff0c;这些都需要用到I…

android ChkBugReport 的安装

参考地址: https://github.com/sonyxperiadev/ChkBugReport/wiki/How-to-install-it 1:先下载下来 git clone https://github.com/sonyxperiadev/ChkBugReport.git 然后在把这两个下载下来 http://sonyxperiadev.github.io/ChkBugReport/download/chkbugreport (Launcher sh…

前台-打印

插件 jsbarcode、uuid、vue-easy-print、vue-qr 主页面 <script setup lang"ts">import { ref } from vueimport PrintUser from ./printUser.vueconst easyPrint ref()const printDemo () > {setTimeout(() > {easyPrint.value.print()}, 1000)}…

kotlin constructor init companion object 与初始化by lazy

kotlin constructor init companion object 与初始化by lazy class MyDemo(private var v: Int) {init {println("init $v")}constructor(m: Int, n: Int) : this(m) {println("constructor $m $n")}//只初始化一次companion object {private var TAG &qu…

spring工程的启动流程?bean的生命周期?提供哪些扩展点?管理事务?解决循环依赖问题的?事务传播行为有哪些?

1.Spring工程的启动流程&#xff1a; Spring工程的启动流程主要包括以下几个步骤&#xff1a; 加载配置文件&#xff1a;Spring会读取配置文件&#xff08;如XML配置文件或注解配置&#xff09;来获取应用程序的配置信息。实例化并初始化IoC容器&#xff1a;Spring会创建并初…

台阶仪是干什么的?在太阳能光伏行业能测什么?

太阳能作为应用广、无排放、无噪声的环保能源&#xff0c;在近些年迎来快速发展&#xff0c;而在各类型的太阳能电池及太阳能充电系统中&#xff0c;多会镀一层透明的ITO导电薄膜&#xff0c;其镀膜厚度对电池片的导电性能有着非常重要的影响&#xff0c;因而需要对镀膜厚度进行…