合理组织安卓活动

本文所有代码均存放于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 Drinkspublic 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 resourceprivate 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。顶级布局包含一个图像和一个列表
定义图像视图:

<ImageViewandroid: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>

定义列表视图

    <ListViewandroid: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"?>
<LinearLayoutxmlns: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"><ImageViewandroid:layout_width="200dp"android:layout_height="100dp"android:src="@drawable/starbuzz_logo"android:contentDescription="@string/starbuzz_logo"/><ListViewandroid: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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_top_level);//创建监听器AdapterView.OnItemClickListener itemClickListener =new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//Drink是列表视图中的第一项,所以位于位置0if (position == 0) {//这个意图来自TopLevelActivity,需要启动DrinkCategoryActivityIntent 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() {@Overridepublic 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 {@Overrideprotected 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() {@Overridepublic 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"><ImageViewandroid:id="@+id/photo"android:layout_width="190dp"android:layout_height="190dp"/><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid: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";@Overrideprotected 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.hqwc.cn/news/8352.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解Ribbon

目录 1.概述 2.使用 2.1.引入 2.2.启用 2.3.切换负载均衡算法 3.负载均衡源码分析 3.1.接口 3.2.抽象类 3.3.选择服务器 3.4.原子性 4.自定义负载均衡算法 1.概述 Ribbon是Netflix开源的一个客户端负载均衡库&#xff0c;也是Spring Cloud Netflix项目的核心组件之…

vue3学习之路

Vue3简介 面临的问题&#xff1a;随着功能的增长&#xff0c;复杂组件的代码变得难以维护&#xff0c;Vue3 就随之而来&#xff0c;TypeScript 使用的越来越多&#xff0c;Vue3就是 TS 写的所以能够更好的支持 TypeScript 在这里介绍就这么简单 vue2 的绝大多数的特性 在 Vu…

Xray-基础详细使用

一&#xff1a;Xray介绍 Xray 是一款功能强大的安全评估工具&#xff0c;由多名经验丰富的一线安全从业者呕心打造而成&#xff0c;可支持与AWVS&#xff0c;BP等众多安全工具联合使用。 二&#xff1a;Xray简易架构&#xff1a; 说明&#xff1a;了解 Xray 的整体架构可以更…

【elementplus】解决el-table开启show-overflow-tooltip后,tooltip的显示会被表格边框遮挡的问题

如图所示&#xff1a; 原因&#xff1a; 1. el-table没有设置高度&#xff1b;2.就是被遮住了 解决&#xff1a; 方法一&#xff1a;给el-table设置高度 方法二: .el-table {overflow: visible !important;}如果不想给el-table设置高度&#xff0c;就直接使用方法二解决即可

机器学习面试题- 特征工程

目录标题 1、为什么要对特征做归一化2、对特征归一化的方法2.1 线性函数归一化2.2 零均值归一化 3、对数据预处理时&#xff0c;如何处理类别型特征3.1 序号编码3.2 独热编码3.3 二进制编码 4、什么是组合特征&#xff1f;如何处理高维组合特征&#xff1f;5、怎样有效地找到组…

es学习知识汇总

es的索引库就相当于mysql的表 es的文档就相当于mysql的一条数据&#xff08;内容&#xff09; 用代码创建索引库到es 新增文档&#xff08;相当于mysql的一条数据&#xff08;内容&#xff09; 模拟将数据库中的到内容新增到es中 查询文档 注&#xff1a;以下 hotel为索引库名…

【Python数据处理】-Pandas笔记

Python数据处理-Pandas笔记 &#x1f4dd; 基本概念 Pandas是一个强大的Python数据处理库&#xff0c;它提供了高效的数据结构和数据分析工具&#xff0c;使数据处理变得简单而快速。本篇笔记将介绍Pandas中最常用的数据结构——Series和DataFrame&#xff0c;以及数据处理的…

使用SQL语句创建存储过程

前言: 本篇文章是记录学校学习SQL server中知识,可用于复习资料. 目录 前言:一、存储过程的创建1、创建简单存储过程2、创建带参数的存储过程3、创建带输出参数的存储过程 二 、使用T一SQL语句管理和维护存储过程2.1 使用sp_helptext查看存储过程student_sc的定义脚本2.2 使用…

大禹智库:下一代向量数据库————具备在线化,协作化,可视化,自动化和安全互信的向量数据库

目录 一、在线化 二、协作化 三、可视化 四、自动化 五、安全互信 结论&#xff1a; 行业分析报告&#xff1a;下一代向量数据库的特征 摘要&#xff1a; 向量数据库是一种用于存储和处理向量数据的数据库系统。随着人工智能和大数据技术的快速发展&#xff0c;向量数据…

匹马赛跑,1个赛道,每次5匹进行比赛,无法对每次比赛计时,但知道每次比赛结果的先后顺序,最少赛多少次可以找出前三名?

1.实现 答&#xff1a;至少需要比7次。 25匹马随机分成5组&#xff0c;每组比赛一次也即总共比5次先看一下每组马的快慢情况。 我们一开始并不知道这25匹马中谁快谁慢&#xff0c;所以需要筛选出那些跑的较快的马出来去竞争前三名&#xff0c;只能将25匹马随机进行分组比赛&…

二叉树 — 给定二叉树中某个节点,返回该节点的后继节点

后继节点定义&#xff1a; 二叉树以中序的方式进行遍历打印&#xff0c;节点X的下一个节点&#xff0c;就是X的后继节点。 假设二叉树如下图所示&#xff1a;则中序遍历的后打印出来的就是 4 -> 2 -> 5 -> 1 -> 6 -> 3 -> 7。如果X 3&#xff0c;则X的后继节…

直接在Notepad++中运行GO语言-(通过NppExec插件)

前提条件&#xff1a; 1.建议阅读文章【直接在Notepad中运行GO语言】&#xff1a; 直接在Notepad中运行GO语言_go语言 notepad_西晋的no1的博客-CSDN博客 2.建议阅读文章【notepad 中安装NppExec插件】&#xff1a; notepad 中安装NppExec插件_西晋的no1的博客-CSDN博客 以下…