安卓(android)订餐菜单【Android移动开发基础案例教程(第2版)黑马程序员】

一、实验目的(如果代码有错漏,可查看源码)

1.掌握Activity生命周的每个方法。

2.掌握Activity的创建、配置、启动和关闭。

3.掌握Intent和IntentFilter的使用。

4.掌握Activity之间的跳转方式、任务栈和四种启动模式。

5.掌握在Activity中添加和使用Fragment。

二、实验条件

1.熟悉Java编程语言;了解Android应用程序的基本结构;掌握XML布局文件的编写;了解Activity和Fragment的基本概念。

2.其他准备:准备好菜单项的图片资源;设计好菜单的数据结构和内容。

三、实验内容

1.搭建菜单界面布局:搭建左侧菜单栏界面布局;搭建右侧菜单列表界面布局;搭建菜单列表界面的条目布局。

2.实现菜单界面功能:封装菜品信息的实体类;加载左侧菜单栏界面布局;编写菜单列表的适配器;加载右侧菜单栏界面布局;实现显示菜单的效果。

3.运行程序:运行程序,显示推荐选项的界面效果;点击“进店必买选项”,显示其对应的界面效果。

4实验过程使用的图片如下:

四、实验指导

1.搭建菜单界面布局

(1)订单菜单界面主要包含三部分:顶部导航栏、左侧菜单栏和右侧菜单列表。搭建界面布局的步骤:

①创建项目程序,导入图片资源素材;

②在res→values目录下创建colors.xml文件,添加颜色定义代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="purple_200">#FFBB86FC</color>
    <color name="purple_500">#FF6200EE</color>
    <color name="purple_700">#FF3700B3</color>
    <color name="teal_200">#FF03DAC5</color>
    <color name="teal_700">#FF018786</color>
    <color name="black">#FF000000</color>
    <color name="white">#FFFFFFFF</color>

    <color name="dark_gray">#626262</color>
    <color name="gray">#f7f8f9</color>

</resources>

③在res→values目录下创建styles.xml文件,定义文本样式代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="tvNavigationBarStyles">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_marginLeft">25dp</item>
        <item name="android:layout_marginTop">4dp</item>
        <item name="android:textSize">16sp</item>
    </style>
    <style name="tvleftStyles">
        <item name="android:layout_width">100dp</item>
        <item name="android:layout_height">40dp</item>
        <item name="android:gravity">center</item>
        <item name="android:textColor">@color/dark_gray</item>
        <item name="android:textSize">16sp</item>
    </style>


</resources>

④在res→layout目录下,在activity_main.xml中添加界面控件;创建left_layout.xml完成搭建左侧菜单栏布局;创建right_layout.xml文件搭建右侧菜单栏布局;创建list_item.xml完成创建listview的条目布局界面,并修改默认标题栏。

activity_main.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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginBottom="4dp"
        android:gravity="center_vertical">

        <TextView
            android:id="@+id/tv_order"
            style="@style/tvNavigationBarStyles"
            android:textColor="@color/black"
            android:text="点菜"
            />
        <TextView
            android:id="@+id/tv_discuss"
            android:layout_toRightOf="@id/tv_order"
            style="@style/tvNavigationBarStyles"
            android:textColor="@color/dark_gray"
            android:text="评价"
            />
        <TextView
            android:id="@+id/tv_business"
            style="@style/tvNavigationBarStyles"
            android:textColor="@color/black"
            android:layout_toRightOf="@id/tv_discuss"
            android:text="商家"
            />

        <TextView

            android:layout_width="70dp"
            android:layout_height="30dp"
            android:textSize="12sp"
            android:layout_alignParentRight="true"
            android:layout_marginRight="15dp"
            android:background="@drawable/left"
            android:gravity="center"
            android:textColor="#ef842c"
            android:text="好友拼单"
            />
    </RelativeLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        >
        <fragment
            android:id="@+id/left"
            android:name="cn.itcast.menu.LeftFragment"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            tools:layout="@layout/left_layout"/>
        <fragment
            android:id="@+id/right"
            android:name="cn.itcast.menu.RightFragment"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="3"
            tools:layout="@layout/right_layout"
            />

    </LinearLayout>
</LinearLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:padding="5dp">
    <ImageView
        android:id="@+id/iv_img"
        android:layout_width="70dp"
        android:layout_height="70dp"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:orientation="vertical"
        >
        <TextView
            android:textSize="14sp"
            android:padding="2dp"
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#868788"
            android:id="@+id/tv_sale"

            android:textSize="12sp"/>
        <TextView
            android:id="@+id/tv_price"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp"

            android:textSize="12sp"/>
    </LinearLayout>

</LinearLayout>

left_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:id="@+id/tv_recommend"
        style="@style/tvleftStyles"
        android:background="@color/white"
        android:text="推荐" />
    <TextView
        android:id="@+id/tv_must_buy"
        style="@style/tvleftStyles"
        android:text="进店必买"/>


</LinearLayout>

right_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <ListView
        android:id="@+id/lv_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@null"
        />

</LinearLayout>

2.实现菜单界面功能

(1)封装菜品信息实体类FoodBean:

package cn.itcast.menu;

public class FoodBean {
    private static final long serialVersionUID=1L;
    private String name;
    private String sales;
    private String price;
    private int img;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSales() {
        return sales;
    }

    public void setSales(String sales) {
        this.sales = sales;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public int getImg() {
        return img;
    }

    public void setImg(int img) {
        this.img = img;
    }

}

(2)加载左侧菜单栏界面布局,在LeftFragment.java中代码实现如下:

package cn.itcast.menu;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;
public class LeftFragment extends Fragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view =inflater.inflate(R.layout.left_layout,container,false);
        return view;}
    @Override
    public void onPause() {super.onPause();}
}

(3)通过ListView实现菜单列表,编写其对应的适配器RightAdapter.java。

package cn.itcast.menu;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;

public class RightAdapter extends BaseAdapter {
    private Context mContext;
    private List<FoodBean> list;
    public RightAdapter(Context context , List<FoodBean>list){
        this.mContext=context;
        this.list=list;
    }
    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder=null;
        if(convertView==null){
            convertView=View.inflate(mContext,R.layout.list_item,null);
            holder= new ViewHolder();
            holder.tv_name=convertView.findViewById(R.id.tv_name);
            holder.tv_sale=convertView.findViewById(R.id.tv_sale);
            holder.tv_price=convertView.findViewById(R.id.tv_price);
            holder.iv_img=convertView.findViewById(R.id.iv_img);
            convertView.setTag(holder);
        }else {
            holder=(ViewHolder) convertView.getTag();
        }
        FoodBean bean=list.get(position);
        holder.tv_name.setText(bean.getName());
        holder.tv_sale.setText(bean.getSales());
        holder.tv_price.setText(bean.getPrice());
        holder.iv_img.setBackgroundResource(bean.getImg());
        return convertView;
    }
    class ViewHolder{
        TextView tv_name,tv_sale,tv_price;
        ImageView iv_img;
    }
}



(4)创建右侧Fragment来显示菜单栏列表信息,具体实现代码如下:

package cn.itcast.menu;

import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import java.io.Serializable;
import java.util.List;

public class RightFragment extends Fragment {
    private ListView lv_list;

    public RightFragment() {

    }

    public RightFragment getInstance(List<FoodBean> list) {
        RightFragment rightFragment = new RightFragment();
        Bundle bundle = new Bundle();
        bundle.putSerializable("list", (Serializable) list);
        rightFragment.setArguments(bundle);
        return rightFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }


    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.right_layout, container, false);
        lv_list = view.findViewById(R.id.lv_list);
        if (getArguments() != null) {
            List<FoodBean> list = (List<FoodBean>) getArguments().getSerializable("list");
            RightAdapter adapter = new RightAdapter(getActivity(), list);
            lv_list.setAdapter(adapter);
        }
        return view;
    }
}

(5)实现显示菜单的效果,在MainActivity.java中定义init()方法、setData()方法、clickEvent()方法和switchData()方法,分别实现初始化界面控件、实现界面控件点击事件和切换右侧菜单列表数据的功能,代码如下:

package cn.itcast.menu;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentTransaction;
import android.app.Fragment;
import android.app.FragmentManager;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
    private FragmentManager fragmentManager;
    private FragmentTransaction fragmentTransaction;
    private Fragment leftFragment;
    private RightFragment rightFragment;
    private TextView tv_recommed,tv_must_buy;

    private String[]names1={"爆款*肥牛鱼豆腐骨肉相连三荤五素一份米饭","豪华双人套餐","【热销】双人套餐(含两份米饭)"};
    private String[]sales1={"月售520 好评度80%","月售520 好评度80%","月售520 好评度80%"};
    private String[]prices1={"$23","$41","$32"};
    private int []imgs1={R.drawable.food1,R.drawable.food2,R.drawable.food3};


    private String[]names2={"鸿运当头-油焖大虾","金肥牛跃龙门","香甜菠萝咕噜肉"};
    private String[]sales2={"月售1314 好评度90%","月售999 好评度85%","月售520 好评度80%"};
    private String[]prices2={"$36","$45","$29"};
    private int []imgs2={R.drawable.foodd1,R.drawable.foodd2,R.drawable.foodd3};

    private Map<String, List<FoodBean>> map;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setData();
        init();
        clickEvent();
    }
    private void init(){//给主页面左侧的fragment界面控件赋值

        fragmentManager = getFragmentManager();
        leftFragment=fragmentManager.findFragmentById(R.id.left);
        tv_recommed=findViewById(R.id.tv_recommend);

        tv_must_buy=findViewById(R.id.tv_must_buy);

    }
    private void setData(){//给数据赋值将其全部放在对应的数据集里
        map=new HashMap<>();
        List<FoodBean>list1=new ArrayList<>();
        List<FoodBean>list2=new ArrayList<>();
        for(int i=0;i<names1.length;i++){
            FoodBean bean=new FoodBean();
            bean.setName(names1[i]);
            bean.setPrice(prices1[i]);
            bean.setImg(imgs1[i]);
            bean.setSales(sales1[i]);
            list1.add(bean);
        }
        map.put("1",list1);
        for(int i=0;i<names2.length;i++){
            FoodBean bean=new FoodBean();
            bean.setName(names2[i]);
            bean.setPrice(prices2[i]);
            bean.setImg(imgs2[i]);
            bean.setSales(sales2[i]);
            list2.add(bean);
        }
        map.put("2",list2);

    }
    private void clickEvent(){//点击推荐还在必须控件变化颜色,可以增加可适度
        tv_recommed.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                switchData (map.get("1"));
                tv_recommed.setBackgroundColor(Color.WHITE);
            }
        });
        tv_must_buy.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                switchData (map.get("2"));
                tv_must_buy.setBackgroundColor(Color.WHITE);
            }
        });
        switchData (map.get("1"));
    }
    public void switchData(List<FoodBean> list){

        rightFragment=new RightFragment().getInstance(list);//实例fragment

        fragmentManager=getFragmentManager();//获取FragmentManager

        fragmentTransaction=getSupportFragmentManager().beginTransaction();//开启事务
        

        fragmentTransaction.replace(R.id.right,rightFragment);//添加一个Fragment


        fragmentTransaction.commit();//提交事务

    }

}

   

五、代码下载地址:

android: 实现注册界面、实现注册界面、饭堂小广播、音乐播放器、记事本、读取手机通讯录、学生管理系统 - Gitee.com

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ快速上手及入门

概念 概念&#xff1a; publisher&#xff1a;生产者&#xff0c;也就是发送消息的一方 consumer&#xff1a;消费者&#xff0c;也就是消费消息的一方 queue&#xff1a;队列&#xff0c;存储消息。生产者投递的消息会暂存在消息队列中&#xff0c;等待消费者处理 exchang…

java命令详解

这里以jdk8为例子&#xff0c;查看默认的垃圾回收器 java -XX:PrintCommandLineFlags -version-XX:UseParallelGC : Parallel Scavenge 和 Parallel Old 组合 -XX:InitialHeapSize268435456 : 初始化堆大小&#xff08;字节&#xff09; -XX:MaxHeapSize4294967296 : 最大堆大…

自主Shell命令行解释器

什么是命令行 我们一直使用的"ls","cd","pwd","mkdir"等命令&#xff0c;都是在命令行上输入的&#xff0c;我们之前对于命令行的理解&#xff1a; 命令行是干啥的&#xff1f;是为我们做命令行解释的。 命令行这个东西实际上是我们…

分析哲学:从 语言解剖到 思想澄清的哲学探险

分析哲学&#xff1a;从 语言解剖 到 思想澄清 的哲学探险 第一节&#xff1a;分析哲学的基本概念与公式解释 【通俗讲解&#xff0c;打比方来讲解&#xff01;】 分析哲学&#xff0c;就像一位 “语言侦探”&#xff0c;专注于 “解剖语言”&#xff0c;揭示我们日常使用的语…

自定义数据集 使用paddlepaddle框架实现逻辑回归

导入必要的库 import numpy as np import paddle import paddle.nn as nn 数据准备&#xff1a; seed1 paddle.seed(seed)# 1.散点输入 定义输入数据 data [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2], [-1.4, -15.7], [-1.4, -37.3], [-1.8, -49.1], [1.5, 75.6…

QtCreator在配置Compilers时,有一个叫ABI的选项,那么什么是ABI?

问题提出 QtCreator在配置Compilers时,有一个叫ABI的选项,那么什么是ABI&#xff1f; ABI&#xff08;Application Binary Interface&#xff09;介绍 ABI&#xff08;Application Binary Interface&#xff0c;应用二进制接口&#xff09;是指应用程序与操作系统或其他程序…

[STM32 标准库]EXTI应用场景 功能框图 寄存器

一、EXTI 外部中断在嵌入式系统中有广泛的应用场景&#xff0c;如按钮开关控制&#xff0c;传感器触发&#xff0c;通信接口中断等。其原理都差不多&#xff0c;STM32会对外部中断引脚的边沿进行检测&#xff0c;若检测到相应的边沿会触发中断&#xff0c;在中断中做出相应的处…

Maven jar 包下载失败问题处理

Maven jar 包下载失败问题处理 1.配置好国内的Maven源2.重新下载3. 其他问题 1.配置好国内的Maven源 打开⾃⼰的 Idea 检测 Maven 的配置是否正确&#xff0c;正确的配置如下图所示&#xff1a; 检查项⼀共有两个&#xff1a; 确认右边的两个勾已经选中&#xff0c;如果没有请…

【JavaScript】Web API事件流、事件委托

目录 1.事件流 1.1 事件流和两个阶段说明 1.2 事件捕获 1.3 事件冒泡 1.4 阻止冒泡 1.5 解绑事件 L0 事件解绑 L2 事件解绑 鼠标经过事件的区别 两种注册事件的区别 2.事件委托 案例 tab栏切换改造 3.其他事件 3.1 页面加载事件 3.2 页面滚动事件 3.2 页面滚…

Spring Cloud工程搭建

目录 工程搭建 搭建父子工程 创建父工程 Spring Cloud版本 创建子项目-订单服务 声明项⽬依赖 和 项⽬构建插件 创建子项目-商品服务 声明项⽬依赖 和 项⽬构建插件 工程搭建 因为拆分成了微服务&#xff0c;所以要拆分出多个项目&#xff0c;但是IDEA只能一个窗口有一…

neo4j入门

文章目录 neo4j版本说明部署安装Mac部署docker部署 neo4j web工具使用数据结构图数据库VS关系数据库 neo4j neo4j官网Neo4j是用ava实现的开源NoSQL图数据库。Neo4作为图数据库中的代表产品&#xff0c;已经在众多的行业项目中进行了应用&#xff0c;如&#xff1a;网络管理&am…

selenium记录Spiderbuf例题C03

防止自己遗忘&#xff0c;故作此为记录。 鸢尾花数据集(Iris Dataset) 这道题牵扯到JS动态加载。 步骤&#xff1a; &#xff08;1&#xff09;进入例题&#xff0c;需要找到按钮规律。 flip_xpath: str r"//li/a[onclickgetIrisData({});]" &#xff08;2&…

自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数

导入必要的库&#xff1a; import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import precision_score, recall_score, f1_score 准备数据&#xff1a; class1_points np.array([[1.9, 1.2],[1.5, 2.1],[1.9, 0.5]…

如何运行Composer安装PHP包 安装JWT库

1. 使用Composer Composer是PHP的依赖管理工具&#xff0c;它允许你轻松地安装和管理PHP包。对于JWT&#xff0c;你可以使用firebase/php-jwt这个库&#xff0c;这是由Firebase提供的官方库。 安装Composer&#xff08;如果你还没有安装的话&#xff09;&#xff1a; 访问Co…

《Linux服务与安全管理》| 数据库服务器安装和配置

《Linux服务与安全管理》| 数据库服务器安装和配置 目录 《Linux服务与安全管理》| 数据库服务器安装和配置 任务一&#xff1a; 安装PostgreSQL数据库&#xff0c;设置远程登录&#xff0c;客户端可以成功登录并操作数据库。 任务二&#xff1a; 安装MySQL数据库&#xf…

【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(一)

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;贪心算法篇–CSDN博客 文章目录 一.贪心算法1.什么是贪心算法2.贪心算法的特点 二.例题1.柠…

DRM系列七:Drm之CREATE_DUMB

本系列文章基于linux 5.15 DRM驱动的显存由GEM&#xff08;Graphics execution management&#xff09;管理。 一、创建流程 创建buf时&#xff0c;user层提供需要buf的width,height以及bpp(bite per pixel)&#xff0c;然后调用drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &…

Python从0到100(八十七):CNN网络详细介绍及WISDM数据集模型仿真

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

WPF进阶 | WPF 动画特效揭秘:实现炫酷的界面交互效果

WPF进阶 | WPF 动画特效揭秘&#xff1a;实现炫酷的界面交互效果 前言一、WPF 动画基础概念1.1 什么是 WPF 动画1.2 动画的基本类型1.3 动画的核心元素 二、线性动画详解2.1 DoubleAnimation 的使用2.2 ColorAnimation 实现颜色渐变 三、关键帧动画深入3.1 DoubleAnimationUsin…

实践网络安全:常见威胁与应对策略详解

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 在数字化转型的浪潮中&#xff0c;网络安全的重要性已达到前所未有的高度。无论是个人用户、企业&#xff0c;还是政府机构…