目录
原创项目模板:基于Android studio 实现外卖(点)订餐系统
一、项目测试视频
网络资源模板--基于Android studio 实现奶茶点餐+说明word
二、项目简介
具有登录注册功能,加入购物车并且付款功能等
三、项目测试环境
四、项目详情设计
这段代码是一个简单的Android应用程序,用于用户注册和登录。以下是代码的功能和结构总结:
1. **权限处理 (`handlePermission()`)**:
- 在应用启动时检查是否已获取写入外部存储权限 (`WRITE_EXTERNAL_STORAGE`)。
- 如果权限已授予,则显示相应的提示信息。
- 如果未授予权限,则请求用户授予该权限。
2. **主活动 (`MainActivity`)**:
- 在 `onCreate()` 方法中设置布局并调用 `handlePermission()` 来处理权限。
- 获取用户名 (`ET_username`) 和密码 (`ET_password`) 的输入字段。
- 包含两个方法用于按钮点击事件:`BT_signUp_onClick()` 和 `BT_logIn_onClick()`。
3. **注册 (`BT_signUp_onClick()`)**:
- 当用户点击注册按钮时调用。
- 检查用户名和密码是否为空,以及密码是否至少为8个字符长。
- 验证用户名是否包含特殊字符。
- 创建一个 `Account` 对象,并尝试将新用户信息保存。
- 如果保存成功,则显示注册成功消息并跳转到 `RootActivity`,同时传递用户名。
- 如果保存失败(用户名已存在),则显示注册失败消息。
4. **登录 (`BT_logIn_onClick()`)**:
- 当用户点击登录按钮时调用。
- 检查用户名和密码是否为空。
- 创建一个 `Account` 对象,并检查用户是否存在(用户名和密码是否匹配)。
- 如果存在,则跳转到 `RootActivity`,同时传递用户名。
- 如果不存在,则显示登录失败消息。
5. **其他**:
- 使用 `Toast` 来显示消息给用户。
- 使用 `Intent` 在不同的活动之间进行页面导航和数据传递。
这段代码的主要功能是基本的用户身份验证和注册管理,同时包含了权限请求的处理。
package com.example.drinkordersystem;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
public class MainActivity extends AppCompatActivity {
private final Context mContext = this;
private EditText ET_username;
private EditText ET_password;
public void handlePermission() {
// 检查是否开启 Manifest.permission.xxx
// (xxx 为权限,根据自己需求添加)
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Permission has been allowed", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "ask for permission",Toast.LENGTH_SHORT).show();
// 请求权限
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handlePermission();
ET_username = findViewById(R.id.et_username);
ET_password = findViewById(R.id.et_password);
}
public void BT_signUp_onClick(View v)
{
String username = ET_username.getText().toString();
System.out.println(username);
String password = ET_password.getText().toString();
if(username.equals("")||password.equals(""))
{
Toast.makeText(this, "用户名或密码不能为空 (!_!)", Toast.LENGTH_SHORT).show();
}
else if(password.length() < 8)
{
Toast.makeText(this, "为安全考虑,密码至少8位(!_!)", Toast.LENGTH_SHORT).show();
}
else if(username.contains("\\")||username.contains("/")||username.contains(":")||username.contains("*")
|| username.contains("?")||username.contains("\"")||username.contains("<")||username.contains(">")
|| username.contains("|"))
{
Toast.makeText(this, "用户名中请勿包含\n \\ / : * ? \" < > |等特殊字符(!_!)", Toast.LENGTH_SHORT).show();
}
else{
Account temp = new Account(username, password, mContext);
Intent intent;
if(temp.saveAccount())
{
//System.out.println("success");
Toast.makeText(this, "注册成功 (^_^)\n 为您直接登录", Toast.LENGTH_SHORT).show();
intent = new Intent(MainActivity.this, RootActivity.class);
intent.putExtra("userName", username);
startActivity(intent);
}
else {
//System.out.println("fail");
Toast.makeText(this, "注册失败 (@_@)\n该用户名已存在,请尝试其他用户名", Toast.LENGTH_SHORT).show();
}
}
}
public void BT_logIn_onClick(View v)
{
String username = ET_username.getText().toString();
System.out.println(username);
String password = ET_password.getText().toString();
if(username.equals("")||password.equals(""))
{
Toast.makeText(this, "用户名或密码不能为空(!_!)", Toast.LENGTH_SHORT).show();
}
else {
Account temp = new Account(username, password, mContext);
Intent intent;
if (temp.exist()) {
//System.out.println("success");
intent = new Intent(MainActivity.this, RootActivity.class);
intent.putExtra("userName", username);
startActivity(intent);
} else {
//System.out.println("fail");
Toast.makeText(this, "登录失败 (@_@)\n用户名或密码错误", Toast.LENGTH_SHORT).show();
}
}
}
}
这段代码是一个简单的Android应用程序,实现了一个包含三个选项卡的界面,每个选项卡对应不同的功能页面。让我帮你简要解释一下:
1. **类和包声明**:
- `RootActivity` 是继承自 `AppCompatActivity` 的活动类。
- 包声明 `com.example.drinkordersystem` 表示这个类所在的包路径。
2. **成员变量**:
- `rg_tab_bar`:RadioGroup 控件,用于管理底部导航栏的选项。
- `rb_order`:RadioButton 控件,用于点单界面的选项卡。
- `fg_order`、`fg_shop`、`fg_bill`:分别是点单界面、购物车界面和查看历史订单界面的 Fragment。
- `fManager`:FragmentManager,用于管理 Fragment。
- `userName`:保存从上一个活动传递过来的用户名。
3. **生命周期方法**:
- `onCreate`:活动创建时调用,设置布局和初始化界面。
4. **方法解析**:
- `defaultFragment()`:将点单界面设为默认界面。
- `onCheckedChanged(RadioGroup group, int checkedId)`:当底部导航栏的选项改变时调用,根据选中的选项切换显示不同的 Fragment。
- `hideAllFragment(FragmentTransaction fragmentTransaction)`:隐藏所有的 Fragment,以便显示选中的 Fragment。
5. **界面管理**:
- 使用 `FragmentTransaction` 在不同选项卡之间进行切换,并确保每次只显示一个 Fragment,隐藏其他的 Fragment。
这段代码主要实现了一个简单的底部导航栏,通过 RadioGroup 和 RadioButton 控件来切换不同的功能界面,每个界面使用 Fragment 实现。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".RootActivity">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/ly_content"
android:layout_above="@+id/rg_tab">
</FrameLayout>
<RadioGroup
android:id="@+id/rg_tab"
android:layout_width="match_parent"
android:layout_height="75dp"
android:gravity="center_vertical"
android:layout_alignParentBottom="true"
android:orientation="horizontal"
android:background="@color/gray">
<RadioButton
android:id="@+id/rb_order"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:button="@null"
android:checked="true"
android:drawableTop="@drawable/order"
android:gravity="center"
android:text = "@string/order"
tools:ignore="VisualLintButtonSize" />
<RadioButton
android:id="@+id/rb_shop"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:button="@null"
android:drawableTop="@drawable/shop"
android:gravity="center"
android:text = "购物车"
tools:ignore="VisualLintButtonSize" />
<RadioButton
android:id="@+id/rb_bill"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:button="@null"
android:drawableTop="@drawable/bill"
android:gravity="center"
android:text = "@string/bill"
tools:ignore="VisualLintButtonSize" />
</RadioGroup>
</RelativeLayout>
<?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"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="center">
<TextView
android:id="@+id/textView_allCost"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="饮料费:¥ 0\n服务费:¥ 0\n总价:¥ 0\n请扫描以下二维码进行支付。"
android:textColor="@color/black"
android:layout_marginHorizontal="20dp"
android:layout_marginTop="10dp"/>
<ImageView
android:id="@+id/imageView3"
android:layout_width="wrap_content"
android:layout_height="335dp"
app:srcCompat="@drawable/qrcode"
android:layout_marginVertical="15dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:id="@+id/button_bought"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="完成支付" />
<Button
android:id="@+id/button_quit"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="取消支付" />
</LinearLayout>
</LinearLayout>
Get 项目模板源码
👇👇👇快捷获取方式👇👇👇