目录
一、项目演示
网络资源模板--基于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>
四、完整的项目源码
👇👇👇👇👇快捷获取方式👇👇👇👇👇