网络资源模板--Android Studio 外卖点餐App+报告

目录

一、项目演示

二、项目测试环境

三、项目详情

四、完整的项目源码 


非原创项目:网络资源模板--Android Studio 外卖点餐App

原创项目: 基于Android studio 实现外卖(点)订餐系统

一、项目演示

网络资源模板--基于Android studio 外卖订餐App

二、项目测试环境

三、项目详情

启动页

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

    <ImageView
        android:id="@+id/splash_image_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@drawable/leadin"/>

</RelativeLayout>

登陆注册页

这段代码是一个简单的登录界面的实现,主要功能包括:

1. **布局与视图绑定**:
   - 在 `onCreate` 方法中通过 `findViewById` 获取了登录界面中的用户名、密码输入框和几个按钮(登录、注册、退出)的实例。

2. **数据库操作**:
   - 使用了自定义的 `zMySqlHelper` 类来进行数据库操作,包括登录验证等。

3. **SharedPreferences 的使用**:
   - 使用 `SharedPreferences` 在登录成功后保存用户名,以便后续在应用其他页面中显示当前登录的用户名。

4. **点击事件监听器**:
   - 为登录按钮、注册按钮和退出按钮设置了点击监听器,分别调用 `login()`、`sign()` 方法和显示退出确认对话框的操作。

5. **退出程序确认**:
   - 在退出按钮的点击事件中,使用 `AlertDialog` 提示用户确认是否退出程序,确认后调用 `finishAffinity()` 和 `System.exit(0)` 完全退出应用。

6. **登录逻辑**:
   - `login()` 方法中获取输入的用户名和密码,通过数据库验证登录信息。如果验证通过,则保存用户名到 `SharedPreferences`,跳转到主界面 `MainActivity`;否则显示相应的错误提示信息。

7. **注册跳转**:
   - `sign()` 方法直接跳转到注册页面 `sign.class`。

总体来说,这段代码实现了基本的登录功能和用户交互,但需要确保数据库操作和布局文件(如 `activity_login.xml`)的正确性和一致性。

 

package com.example.finalwork;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class login extends AppCompatActivity {

    private EditText etUsername;
    private EditText etPassword;
    private zMySqlHelper mYsqliteopenhelper;
    private SharedPreferences preferences;

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

        //元素获取
        etUsername = findViewById(R.id.et_username);
        etPassword = findViewById(R.id.et_password);
        TextView login = findViewById(R.id.login_login);
        TextView sign = findViewById(R.id.login_sign);
        TextView exit = findViewById(R.id.exit_app);
        //初始化数据库的对象
        mYsqliteopenhelper = new zMySqlHelper(this);
        //存一下当前账号,之后的“我的”页面会用作显示
        //由于每次都只是显示当前账号信息,因此使用SharedPreferences既能覆盖存储,又能保存数据,正好切合这一特性
        preferences = getSharedPreferences("MyPrefs", MODE_PRIVATE);

        //点击登录按钮后,回调登录函数
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                login();
            }
        });
        //点击注册按钮后,回调,跳转到注册页面
        sign.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sign();
            }
        });

        //监听 - 退出程序
        exit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog.Builder builder = new AlertDialog.Builder(login.this);
                builder.setTitle("尊敬的用户");
                builder.setMessage("您确定要退出程序吗?")
                        .setPositiveButton("残忍离开", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // 如果用户点击确定按钮,则所有数据销毁,并退出程序
                                finishAffinity();
                                System.exit(0);
                            }
                        })
                        .setNegativeButton("我再想想", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // 如果用户点击取消按钮,则关闭对话框并不做任何操作
                                dialog.cancel();
                            }
                        });
                //把该有的文字和设置都准备好,再在屏幕上进行展示
                builder.create().show();
            }
        });
    }

    private void login() {
        String username = etUsername.getText().toString().trim();
        String password = etPassword.getText().toString().trim();
        boolean login = mYsqliteopenhelper.login(username,password);

        //如果登录函数是返回true的,说明账号密码正确,能登录成功
        if (login) {
            // 保存账号和密码到SharedPreferences(等下登录后显示的账号username,就是此处最新存储的数据!!!)
            SharedPreferences.Editor editor = preferences.edit();
            editor.putString("username", username);
            editor.apply();    // 提交保存
            Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
            // 创建意图,跳转到MainActivity
            Intent to_p1 = new Intent(login.this, MainActivity.class);
            to_p1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_p1);
        }else if(TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){
            Toast.makeText(this, "账号密码不能为空", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "账号或密码错误", Toast.LENGTH_SHORT).show();
        }
    }

    private void sign() {
        //意图跳转: 点击去注册
        Intent to_sign = new Intent(login.this, sign.class);
        to_sign.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(to_sign);
    }
}

 

这段代码实现了一个基本的注册功能和界面跳转:

- **功能概述**:
  - 用户可以在注册界面输入用户名和密码,并确认密码进行注册。
  - 如果用户名或密码为空,或者确认密码与密码不匹配,会显示相应的错误提示。
  - 注册成功后,将用户信息保存到数据库中,并跳转回登录界面进行登录操作。
  - 如果用户名已存在于数据库中,则会提示用户重新输入。

- **重要组件**:
  - 使用了 `EditText` 控件获取用户输入的用户名和密码。
  - 使用了 `TextView` 控件作为返回按钮和注册按钮,并为其设置了点击事件监听器。
  - 使用了自定义的 `zMySqlHelper` 类来进行数据库操作,包括注册用户和验证登录信息。

- **代码逻辑**:
  - `onCreate` 方法中初始化界面元素,并为返回按钮和注册按钮设置点击监听器。
  - `sign_to_login` 方法中获取输入框中的文本内容,进行输入校验和注册操作。
  - 注册成功后,显示成功提示并跳转回登录界面;如果注册失败(用户名已存在),则显示相应的失败提示。

这段代码通过简单的布局和逻辑实现了用户注册功能,并能有效地处理用户输入和反馈注册结果。

package com.example.finalwork;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.example.finalwork.javabean.User;

public class sign extends AppCompatActivity {

    private EditText username;
    private EditText password;
    private EditText confirm;
    private zMySqlHelper mySqlHelper;

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

        //获取元素
        TextView back = findViewById(R.id.return_login);

        username = findViewById(R.id.sign_etUsername);
        password = findViewById(R.id.sign_etPassword);
        confirm = findViewById(R.id.sign_confirm_etPassword);

        TextView sign = findViewById(R.id.sign);
        //初始化数据库的对象
        mySqlHelper = new zMySqlHelper(this);

        //监听+跳转
        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //返回键: 到login界面
                Intent it1 = new Intent(sign.this, login.class);
                it1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(it1);
            }
        });

        //点击注册按钮后,回调,如果注册成功,则跳转到登录页面
        sign.setOnClickListener(new View.OnClickListener() {
            //注册键: 也是到login界面
            @Override
            public void onClick(View v) {
                sign_to_login();
            }
        });
    }

    private void sign_to_login() {
        //获取输入框的文本内容,去掉多余空格并转为字符串,最后赋给变量接收
        String Username = username.getText().toString().trim();
        String Password = password.getText().toString().trim();
        String Confirm = confirm.getText().toString().trim();

        User u = new User(Username,Password);
        //如果获取的账号或者密码字符串为空,那么就是没输入完,在下方弹出提示框:请输入账号和密码(持续2秒)
        if (TextUtils.isEmpty(Username) || TextUtils.isEmpty(Password)) {
            Toast.makeText(this, "请输入账号和密码", Toast.LENGTH_SHORT).show();
        } else if (!Password.equals(Confirm)) {
            Toast.makeText(this, "两次密码输入不一致", Toast.LENGTH_SHORT).show();
        } else{
            //这个分支肯定合法,直接来一手注册!
            long l = mySqlHelper.register(u);
            if(l == 1){
                Toast.makeText(this, "注册成功", Toast.LENGTH_SHORT).show();
                //随后跳转回登录界面(MainActivity)界面,进行登录
                Intent to_login = new Intent(sign.this,login.class);
                to_login.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(to_login);
            }else {
                Toast.makeText(this, "账号已存在,请重新输入", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

首页

这段代码的主要功能和逻辑:

这段代码实现了一个主界面的 Android 应用,包含了以下主要功能:

1. **视频播放**:
   - 使用 `VideoView` 控件播放了三个不同的本地视频文件(`food1.mp4`、`food2.mp4`、`food3.mp4`)。
   - 每个视频播放前会将视频跳转到起始位置(第0毫秒),并为每个 `VideoView` 设置了 `MediaController` 辅助控件,以方便用户控制播放。

2. **推荐商品展示**:
   - 使用 `ImageView` 控件展示了八张推荐商品的图片,并在图片下方配有相应的文字标签。

3. **底部导航栏功能**:
   - 底部导航栏包含三个 `TextView` 元素,分别作为页面导航按钮标记为 `p2`、`p3`、`p4`。
   - 点击不同的导航按钮会触发跳转到相应的页面:
     - `p2` 跳转到 `page2` 相关页面。
     - `p3` 根据购物车数据库中商品数量是否为0来决定跳转到 `page3_Cart` 或 `page3` 页面。
     - `p4` 跳转到 `page4` 页面。

4. **购物车判断**:
   - 在点击 `p3` 导航按钮时,检查本地数据库中购物车表中的商品数量,根据数量决定跳转到购物车页面或其他页面。

5. **数据库操作**:
   - 使用 `SQLiteDatabase` 进行数据库操作,包括创建购物车表和查询操作,以支持购物车功能的实现。

这段代码通过结合视频播放、图片展示和页面跳转的功能,实现了一个简单的主界面应用,为用户提供了观看视频和浏览推荐商品的功能,并通过底部导航栏实现了页面间的快速导航。

 

package com.example.finalwork;

import static androidx.constraintlayout.widget.ConstraintLayoutStates.TAG;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.VideoView;

public class MainActivity extends AppCompatActivity {

    private SQLiteDatabase sqLiteDatabase;

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

        HorizontalScrollView horizontalScrollView = findViewById(R.id.scroll);
        horizontalScrollView.post(() -> horizontalScrollView.scrollTo(0, 0));


        //获取视频
        VideoView tv1 = findViewById(R.id.video1);
        //拿到路径并播放
        String videoPath1 = "android.resource://" + getPackageName() + "/" + R.raw.food1;
        tv1.setVideoURI(Uri.parse(videoPath1));
        //tv1.start();        //先别急着播放,而是通过设置下面代码,将画面定格在第0毫秒
        tv1.setOnPreparedListener(mp -> {
            mp.seekTo(0); // 将视频跳转到第0毫秒
        });
        //添加别的视频辅助控件
        MediaController mediaController1 = new MediaController(this);
        mediaController1.setAnchorView(tv1);
        tv1.setMediaController(mediaController1);

        VideoView tv2 = findViewById(R.id.video2);
        String videoPath2 = "android.resource://" + getPackageName() + "/" + R.raw.food2;
        tv2.setVideoURI(Uri.parse(videoPath2));
        tv2.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.seekTo(0); // 将视频跳转到第0毫秒
            }
        });
        //添加别的视频辅助控件
        MediaController mediaController2 = new MediaController(this);
        mediaController2.setAnchorView(tv2);
        tv2.setMediaController(mediaController2);

        VideoView tv3 = findViewById(R.id.video3);
        String videoPath3 = "android.resource://" + getPackageName() + "/" + R.raw.food3;
        tv3.setVideoURI(Uri.parse(videoPath3));
        tv3.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.seekTo(0); // 将视频跳转到第0毫秒
            }
        });
        //添加别的视频辅助控件
        MediaController mediaController3 = new MediaController(this);
        mediaController3.setAnchorView(tv3);
        tv3.setMediaController(mediaController3);

        //推荐图片
        ImageView png1 = findViewById(R.id.p1_png1_1);
        png1.setImageResource(R.drawable.main101);
        ImageView png2 = findViewById(R.id.p1_png1_2);
        png2.setImageResource(R.drawable.main102);
        ImageView png3 = findViewById(R.id.p1_png2_1);
        png3.setImageResource(R.drawable.main201);
        ImageView png4 = findViewById(R.id.p1_png2_2);
        png4.setImageResource(R.drawable.main202);
        ImageView png5 = findViewById(R.id.p1_png3_1);
        png5.setImageResource(R.drawable.main301);
        ImageView png6 = findViewById(R.id.p1_png3_2);
        png6.setImageResource(R.drawable.main302);
        ImageView png7 = findViewById(R.id.p1_png4_1);
        png7.setImageResource(R.drawable.main401);
        ImageView png8 = findViewById(R.id.p1_png4_2);
        png8.setImageResource(R.drawable.main402);
        //对应文字
        TextView t1_1 = findViewById(R.id.p1_tx1_1);
        TextView t1_2 = findViewById(R.id.p1_tx1_2);
        TextView t2_1 = findViewById(R.id.p1_tx2_1);
        TextView t2_2 = findViewById(R.id.p1_tx2_2);
        TextView t3_1 = findViewById(R.id.p1_tx3_1);
        TextView t3_2 = findViewById(R.id.p1_tx3_2);
        TextView t4_1 = findViewById(R.id.p1_tx4_1);
        TextView t4_2 = findViewById(R.id.p1_tx4_2);
        //获取底部导航栏的其他三个页面接口
        TextView p2 = findViewById(R.id.below_2);
        TextView p3 = findViewById(R.id.below_3);
        TextView p4 = findViewById(R.id.below_4);

        //监听 - 店铺跳转
        png1.setOnClickListener(view -> {
            Intent to_noodles = new Intent(MainActivity.this, page2_noodles.class);
            to_noodles.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_noodles);
        });
        png2.setOnClickListener(view -> {
            Intent to_bigstall = new Intent(MainActivity.this, page2_bigstall.class);
            to_bigstall.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_bigstall);
        });
        png3.setOnClickListener(view -> {
            Intent to_chicken = new Intent(MainActivity.this, page2_chicken.class);
            to_chicken.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_chicken);
        });
        png4.setOnClickListener(view -> {
            Intent to_midfood = new Intent(MainActivity.this, page2_midfood.class);
            to_midfood.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_midfood);
        });
        png5.setOnClickListener(view -> {
            Intent to_F33 = new Intent(MainActivity.this, page2_Italian.class);
            to_F33.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_F33);
        });
        png6.setOnClickListener(view -> {
            Intent to_juicetea = new Intent(MainActivity.this, page2_juicetea.class);
            to_juicetea.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_juicetea);
        });
        png7.setOnClickListener(view -> {
            Intent to_pizza = new Intent(MainActivity.this, page2_pizza.class);
            to_pizza.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_pizza);
        });
        png8.setOnClickListener(view -> {
            Intent to_northwest = new Intent(MainActivity.this, page2_northwest.class);
            to_northwest.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_northwest);
        });

        t1_1.setOnClickListener(view -> {
            Intent to_noodles = new Intent(MainActivity.this, page2_noodles.class);
            to_noodles.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_noodles);
        });
        t1_2.setOnClickListener(view -> {
            Intent to_bigstall = new Intent(MainActivity.this, page2_bigstall.class);
            to_bigstall.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_bigstall);
        });
        t2_1.setOnClickListener(view -> {
            Intent to_chicken = new Intent(MainActivity.this, page2_chicken.class);
            to_chicken.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_chicken);
        });
        t2_2.setOnClickListener(view -> {
            Intent to_midfood = new Intent(MainActivity.this, page2_midfood.class);
            to_midfood.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_midfood);
        });
        t3_1.setOnClickListener(view -> {
            Intent to_F33 = new Intent(MainActivity.this, page2_Italian.class);
            to_F33.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_F33);
        });
        t3_2.setOnClickListener(view -> {
            Intent to_juicetea = new Intent(MainActivity.this, page2_juicetea.class);
            to_juicetea.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_juicetea);
        });
        t4_1.setOnClickListener(view -> {
            Intent to_pizza = new Intent(MainActivity.this, page2_pizza.class);
            to_pizza.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_pizza);
        });
        t4_2.setOnClickListener(view -> {
            Intent to_northwest = new Intent(MainActivity.this, page2_northwest.class);
            to_northwest.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_northwest);
        });

        //监听 - 导航栏跳转
        p2.setOnClickListener(view -> {
            Intent to_p2 = new Intent(MainActivity.this, page2.class);
            to_p2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_p2);
        });
        p3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //点击跳转到购物车,需判断购物车是否为空,来决定跳转到哪一个xml页面
                sqLiteDatabase = openOrCreateDatabase("MYsqlite.db", MODE_PRIVATE, null);
//                // 判断表是否存在
//                boolean isTableExists = isTableExists("cart", sqLiteDatabase);
//
//                // 如果表不存在,创建表
//                if (!isTableExists) {
//                    // 执行创建表的操作
//                    // ...
//                }
                sqLiteDatabase.execSQL("create table if not exists cart(foodname varchar(32),foodprice varchar(32),quantity varchar(32))");
                Log.e("1","先执行这里的建表cart,否则下面的query一直报错没有建表");
                Cursor cursor = sqLiteDatabase.query("cart", null, null, null, null, null, null);
                if (cursor.moveToFirst()) {
                    do {
                        String foodname = null;
                        String foodprice = null;
                        int quantity = 0;
                        try {
                            //拿到下标,游标指向相应下标位置即可拿到对应数据信息
                            foodname = cursor.getString(cursor.getColumnIndexOrThrow("foodname"));
                            foodprice = cursor.getString(cursor.getColumnIndexOrThrow("foodprice"));
                            quantity = cursor.getInt(cursor.getColumnIndexOrThrow("quantity"));
                        } catch (IllegalArgumentException e) {
                            Log.e(TAG, "getColumnIndexOrThrow error: " + e.getMessage());
                        }
                        if (quantity !=0) {
                            //但凡找到一个数量不为0的商品都说明购物车不为空,需跳到 page3_Cart
                            Intent to_p3cart = new Intent(MainActivity.this, page3_Cart.class);
                            to_p3cart.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            startActivity(to_p3cart);
                            return;
                        }
                    } while (cursor.moveToNext());
                }
                // 关闭游标和数据库连接
                cursor.close();
                sqLiteDatabase.close();
                //前面的quantity都为0,没有return,所以要执行以下代码,跳转到 page3
                Intent to_p3 = new Intent(MainActivity.this, page3.class);
                to_p3.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(to_p3);
            }
        });
        p4.setOnClickListener(view -> {
            Intent to_p4 = new Intent(MainActivity.this, page4.class);
            to_p4.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            to_p4.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(to_p4);
        });
    }
}

商品详情页

这段代码实现了一个名为 `page2_bigstall` 的 `Activity`,主要功能如下:

1. **界面初始化与显示**:
   - 在 `onCreate` 方法中,设置了布局文件 `activity_page2_bigstall.xml`。
   - 初始化了界面元素,包括返回按钮 (`back`)、商品名称 (`n`)、购物车总数显示 (`totalshow`) 和去结算按钮 (`toCart`)。

2. **数据库操作与购物车数量显示**:
   - 使用 `SQLiteDatabase` 打开或创建名为 `MYsqlite.db` 的数据库,查询购物车表 (`cart`) 中的所有商品记录。
   - 计算并显示购物车中所有商品的总数量 (`allnum`),并将其展示在界面上的 `totalshow` 文本视图中。

3. **商品列表展示与适配器设置**:
   - 使用 `ListView` 控件 (`mListView`) 展示商品列表。
   - 准备了商品数据的列表 (`mList`),每个商品由图片 (`img`)、名称 (`name`) 和价格 (`price`) 组成。
   - 使用 `SimpleAdapter` 将商品数据与自定义的列表项布局 (`activity_page2_bigstall1.xml`) 关联,并设置给 `mListView`。

4. **购物车功能实现**:
   - 在商品列表的每个项目上设置了点击事件,当用户点击加入购物车 (`addToCart`) 时,将选定商品添加到购物车数据库 (`cart`) 中。
   - 点击后更新购物车中的商品数量,并更新界面上的购物车总数显示 (`totalshow`)。

5. **跳转功能实现**:
   - 返回按钮 (`back`) 点击时,跳转回 `page2` 页面。
   - 去结算按钮 (`toCart`) 点击时,检查购物车中是否有商品,若有则跳转到 `page3_Cart` 页面;否则跳转到 `page3` 页面。

6. **数据传递**:
   - 在跳转到 `page3_Cart` 页面时,使用 `Bundle` 将当前页面的名称 (`name`) 打包传递到 `page3_Cart` 页面,以便在返回时能够回到当前页面。

总体来说,这段代码实现了一个具有商品展示、购物车管理和页面跳转功能的应用页面,通过数据库操作保证了购物车数据的实时更新和一致性。

 

<?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"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/linearLayout21"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="#0099ff"
        android:orientation="horizontal"
        android:padding="20dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/japanfood_back"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:background="@drawable/baseline_arrow_back_24"
            android:paddingLeft="10dp"
            android:paddingTop="12dp"
            android:paddingRight="10dp" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="7"
            android:paddingLeft="50dp"
            android:text="店铺详情"
            android:textColor="@color/white"
            android:textSize="20sp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout20"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:background="@drawable/lightbluebg"
        android:orientation="horizontal"
        android:padding="20dp"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout21">

        <TextView
            android:id="@+id/name"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginLeft="10dp"
            android:layout_weight="1.5"
            android:text="左町日料"
            android:textSize="24sp" />

        <ImageView
            android:id="@+id/chicken"
            android:layout_width="0dp"
            android:layout_height="110dp"
            android:layout_marginRight="10dp"
            android:layout_weight="1"
            android:scaleType="centerCrop"
            android:src="@drawable/japanfood" />
    </LinearLayout>

    <TextView
        android:id="@+id/textView9"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="菜单"
        android:textColor="@color/blue"
        android:textSize="20sp"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout20" />

    <ListView
        android:id="@+id/lv"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#fefefe"
        app:layout_constraintBottom_toTopOf="@+id/linearLayout22"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView9" />

    <LinearLayout
        android:id="@+id/linearLayout22"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="15dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:text="购物车"
            android:textColor="@color/purple"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/totalshow"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="left|center"
            android:layout_weight="2"
            android:text=""
            android:textSize="18sp" />

        <TextView
            android:id="@+id/toCart"
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:background="@color/purple"
            android:gravity="center"
            android:text="去结算"
            android:textColor="@color/white"
            android:textSize="20sp" />
    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

四、完整的项目源码 

👇👇👇👇👇快捷获取方式👇👇👇👇👇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程乐学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值