Android Studio 实现小熊记账本 (功能多,简单)

打印 上一主题 下一主题

主题 635|帖子 635|积分 1905

一、高质量源码(非开源,白嫖低价勿扰)

   
关注公众号:《编程乐学》

   
后台复兴:24010601

    同款低价传送链接(仅9.9):
  网络资源模板--基于 Android Studio 实现的简约记账本-CSDN博客
  目次
前言
一、运行演示
二、开发环境
三、完成步骤
步骤 1:创建项目
步骤 2:创建包名
步骤 3:实现启动页
步骤 5:实现用户注册
步骤 6:实现用户登录
步骤 7:实现主页面编写
步骤 8:记账页面编写
步骤 9:历史记录页面编写
步骤10:我的页面的编写
步骤11:账单搜刮页面的编写
步骤12:统计页面的编写
四、获取源码


前言

       本次实现的Android Studio 小熊记账本 (功能多,简单)项目,核心功能是可以记录收支情况,可以给收支选择各种分类选项,好比“餐饮”、“零食”、“购物”等等,还可以添加备注和修改日期。然后会在首页展示你的本月支持和收入信息,还可以选择隐蔽信息掩护隐私。通过【账单记录】可以查察自己的所有账单记录,通过【账单详情】可以看到用柱状图显示的账单情况,在设置内里可以清空所有数据,长按可以删除单条数据,功能非常全面丰富。

一、运行演示

   我们先来看下运行演示结果
      Android Studio 实现小熊记账本App
  二、开发环境


           我的开发环境如下,各人的AS版本不必要和我相同,只要是近两年从官网下载的版本,都是比4.0.0 (2020)高的,是可以满意运行和开发要求的。
  三、完成步骤

步骤 1:创建项目

        打开 Android studio 开发工具后,进行项目创建,左上角 File—>New Project、填写后点击 Finish 完成创建!
步骤 2:创建包名

        选中com.example.note包 名 右 键 New — >package 并按需求依次 activity(存放各类 Activity)、adapter(存放各类适配器) 等包名,后续代码将按对应包名去创建,并将 MainActivity.java 移动到 activity包 下

步骤 3:实现启动页

        在 activity包上右键创建 New—>Activity—>Empty Activity 选项创建 Activity 后弹 出对话框,输入相关信息,即可创建 Activity.
启动页页面结构配景放置一张自己喜好的logo即可

这里我们直接看java部分代码:
  1. package com.example.tallybook.Activity;
  2. import android.content.Intent;
  3. import android.os.Bundle;
  4. import android.os.CountDownTimer;
  5. import android.os.Handler;
  6. import androidx.appcompat.app.AppCompatActivity;
  7. import com.example.tallybook.R;
  8. public class StartActivity extends AppCompatActivity {
  9.     private Handler handler = new Handler();
  10.     private Runnable runnable = new Runnable() {
  11.         @Override
  12.         public void run() {
  13.             tomainActive();
  14.         }
  15.     };
  16.     // 进入主页面
  17.     private void tomainActive() {
  18.         startActivity(new Intent(this, LoginActivity.class));
  19.         // 跳转完成后注销
  20.         finish();
  21.     }
  22.     @Override
  23.     protected void onCreate(Bundle savedInstanceState) {
  24.         super.onCreate(savedInstanceState);
  25.         setContentView(R.layout.activity_start);
  26.       
  27.     }
  28.    
  29. }
复制代码

步骤 5:实现用户注册

        在 activity包上右键创建 New—>Activity—>Empty Activity 选项创建 Activity 后弹 出对话框,输入相关信息,即可创建 Activity.
用户注册页面结构代码如下所示:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     android:background="#c3def0"
  8.     tools:context=".Activity.RegisterActivity">
  9.     <LinearLayout
  10.         android:layout_width="0dp"
  11.         android:layout_height="0dp"
  12.         android:layout_marginStart="32dp"
  13.         android:layout_marginTop="24dp"
  14.         android:layout_marginEnd="32dp"
  15.         android:orientation="vertical"
  16.         app:layout_constraintBottom_toBottomOf="parent"
  17.         app:layout_constraintEnd_toEndOf="parent"
  18.         app:layout_constraintHorizontal_bias="0.494"
  19.         app:layout_constraintStart_toStartOf="parent"
  20.         app:layout_constraintTop_toBottomOf="@+id/imageView2">
  21.         <EditText
  22.             android:id="@+id/username_edittext"
  23.             android:layout_width="match_parent"
  24.             android:layout_height="wrap_content"
  25.             android:hint="请输入账号"
  26.             android:textColor="#4d7ea8"
  27.             android:textColorHint="#4d7ea8" />
  28.         <EditText
  29.             android:id="@+id/password_edittext"
  30.             android:layout_width="match_parent"
  31.             android:layout_height="wrap_content"
  32.             android:layout_marginTop="20dp"
  33.             android:hint="请输入密码"
  34.             android:inputType="textPassword"
  35.             android:textColor="#85a7dc"
  36.             android:textColorHint="#4d7ea8" />
  37.         <EditText
  38.             android:id="@+id/repassword_edittext"
  39.             android:layout_width="match_parent"
  40.             android:layout_height="wrap_content"
  41.             android:layout_marginTop="20dp"
  42.             android:hint="请再次输入密码"
  43.             android:inputType="textPassword"
  44.             android:textColor="#4d7ea8"
  45.             android:textColorHint="#4d7ea8" />
  46.         <TextView
  47.             android:id="@+id/tv_login"
  48.             android:layout_width="match_parent"
  49.             android:layout_height="wrap_content"
  50.             android:layout_marginTop="10dp"
  51.             android:gravity="center|right"
  52.             android:text="已有帐号,立即登录!"
  53.             android:textColor="#4d7ea8"
  54.             android:textSize="14sp"
  55.             android:textStyle="bold" />
  56.         <Button
  57.             android:id="@+id/register_button"
  58.             android:layout_width="match_parent"
  59.             android:layout_height="40dp"
  60.             android:layout_marginTop="50dp"
  61.             android:background="@drawable/lr_btn"
  62.             android:text="立 即 注 册"
  63.             android:textColor="#c3def0"
  64.             android:textSize="18sp" />
  65.     </LinearLayout>
  66.     <ImageView
  67.         android:id="@+id/imageView2"
  68.         android:layout_width="0dp"
  69.         android:layout_height="200dp"
  70.         android:layout_marginTop="16dp"
  71.         app:layout_constraintEnd_toEndOf="parent"
  72.         app:layout_constraintStart_toStartOf="parent"
  73.         app:layout_constraintTop_toTopOf="parent"
  74.         app:srcCompat="@drawable/logo" />
  75. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
编写 RegisterActivity.java 的代码为:
  1. package com.example.tallybook.Activity;
  2. import android.content.Intent;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.Button;
  6. import android.widget.EditText;
  7. import android.widget.TextView;
  8. import android.widget.Toast;
  9. import androidx.appcompat.app.AppCompatActivity;
  10. import com.example.tallybook.Data.DatabaseHelper;
  11. import com.example.tallybook.R;
  12. public class RegisterActivity extends AppCompatActivity {
  13.     private EditText mUserNameEditText;
  14.     private EditText mPasswordEditText,mRePasswordEditText;
  15.     private TextView tvLogin;
  16.     @Override
  17.     protected void onCreate(Bundle savedInstanceState) {
  18.         super.onCreate(savedInstanceState);
  19.         setContentView(R.layout.activity_register);
  20.         mUserNameEditText = findViewById(R.id.username_edittext);
  21.         mPasswordEditText = findViewById(R.id.password_edittext);
  22.         mRePasswordEditText = findViewById(R.id.repassword_edittext);
  23.         tvLogin = findViewById(R.id.tv_login);
  24.       
  25.         // 跳转登陆页面
  26.         tvLogin.setOnClickListener(new View.OnClickListener() {
  27.             @Override
  28.             public void onClick(View v) {
  29.                 Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
  30.                 startActivity(intent);
  31.                 finish();
  32.             }
  33.         });
  34.         Button registerButton = findViewById(R.id.register_button);
  35.         registerButton.setOnClickListener(new View.OnClickListener() {
  36.             @Override
  37.             public void onClick(View v) {
  38.                 // 获取输入的账号密码
  39.                 String username = mUserNameEditText.getText().toString().trim();
  40.                 String password = mPasswordEditText.getText().toString().trim();
  41.                 String repassword = mRePasswordEditText.getText().toString().trim();
  42.                 if (username.isEmpty() || password.isEmpty()) {
  43.                     Toast.makeText(getApplicationContext(), "请输入账号或密码", Toast.LENGTH_SHORT).show();
  44.                     return;
  45.                 }
  46.                 if (!password.equals(repassword)) {
  47.                     Toast.makeText(getApplicationContext(), "密码不一致,请重新输入", Toast.LENGTH_SHORT).show();
  48.                     return;
  49.                 }
  50.                 boolean result = mDatabaseHelper.insertData(username, password);
  51.                 if (result) {
  52.                     Toast.makeText(getApplicationContext(), "注册成功", Toast.LENGTH_SHORT).show();
  53.                     Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
  54.                     startActivity(intent);
  55.                     finish();
  56.                 } else {
  57.                     Toast.makeText(getApplicationContext(), "注册失败", Toast.LENGTH_SHORT).show();
  58.                 }
  59.             }
  60.         });
  61.     }
  62. }
复制代码
步骤 6:实现用户登录

        在 activity包上右键创建 New—>Activity—>Empty Activity 选项的对话框下输入 LoginActivity 创建,同时会在 res-layout 生成 activity_login.xml 文件.
activity_login.xml页面代码如下所示L:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     android:background="#c3def0"
  8.     tools:context=".Activity.LoginActivity">
  9.     <LinearLayout
  10.         android:layout_width="0dp"
  11.         android:layout_height="0dp"
  12.         android:layout_marginStart="32dp"
  13.         android:layout_marginTop="24dp"
  14.         android:layout_marginEnd="32dp"
  15.         android:orientation="vertical"
  16.         app:layout_constraintBottom_toBottomOf="parent"
  17.         app:layout_constraintEnd_toEndOf="parent"
  18.         app:layout_constraintStart_toStartOf="parent"
  19.         app:layout_constraintTop_toBottomOf="@+id/imageView">
  20.         <EditText
  21.             android:id="@+id/username_edittext"
  22.             android:layout_width="match_parent"
  23.             android:layout_height="wrap_content"
  24.             android:hint="请输入账号"
  25.             android:textColor="#4d7ea8"
  26.             android:textColorHint="#4d7ea8" />
  27.         <EditText
  28.             android:id="@+id/password_edittext"
  29.             android:layout_width="match_parent"
  30.             android:layout_height="wrap_content"
  31.             android:layout_marginTop="20dp"
  32.             android:hint="请输入密码"
  33.             android:inputType="textPassword"
  34.             android:textColor="#4d7ea8"
  35.             android:textColorHint="#4d7ea8" />
  36.         <LinearLayout
  37.             android:layout_width="match_parent"
  38.             android:layout_height="wrap_content"
  39.             android:layout_marginTop="10dp"
  40.             android:orientation="horizontal">
  41.             <TextView
  42.                 android:id="@+id/textView5"
  43.                 android:layout_width="wrap_content"
  44.                 android:layout_height="wrap_content"
  45.                 android:gravity="center|right"
  46.                 android:text="忘记密码?"
  47.                 android:textColor="#4d7ea8"
  48.                 android:textSize="14sp"
  49.                 android:textStyle="bold" />
  50.             <TextView
  51.                 android:id="@+id/register_button"
  52.                 android:layout_width="match_parent"
  53.                 android:layout_height="wrap_content"
  54.                 android:gravity="center|right"
  55.                 android:text="还没有账号?立即注册!"
  56.                 android:textColor="#4d7ea8"
  57.                 android:textSize="14sp"
  58.                 android:textStyle="bold" />
  59.         </LinearLayout>
  60.         <Button
  61.             android:id="@+id/login_button"
  62.             android:layout_width="match_parent"
  63.             android:layout_height="40dp"
  64.             android:layout_marginTop="60dp"
  65.             android:background="@drawable/lr_btn"
  66.             android:text="立 即 登 录"
  67.             android:textColor="#c3def0"
  68.             android:textSize="18sp" />
  69.     </LinearLayout>
  70.     <ImageView
  71.         android:id="@+id/imageView"
  72.         android:layout_width="0dp"
  73.         android:layout_height="200dp"
  74.         android:layout_marginTop="16dp"
  75.         app:layout_constraintEnd_toEndOf="parent"
  76.         app:layout_constraintStart_toStartOf="parent"
  77.         app:layout_constraintTop_toTopOf="parent"
  78.         app:srcCompat="@drawable/logo" />
  79. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
对应的Java页面代码如下所示:
  1. package com.example.tallybook.Activity;
  2. import android.content.Intent;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.Button;
  6. import android.widget.EditText;
  7. import android.widget.TextView;
  8. import android.widget.Toast;
  9. import androidx.appcompat.app.AppCompatActivity;
  10. import com.example.tallybook.Data.DatabaseHelper;
  11. import com.example.tallybook.R;
  12. public class LoginActivity extends AppCompatActivity {
  13.     private EditText mUserNameEditText;
  14.     private EditText mPasswordEditText;
  15.     private Button mLoginButton;
  16.     private TextView rEgisterButton;
  17.     @Override
  18.     protected void onCreate(Bundle savedInstanceState) {
  19.         super.onCreate(savedInstanceState);
  20.         setContentView(R.layout.activity_login);
  21.         mUserNameEditText = findViewById(R.id.username_edittext);
  22.         mPasswordEditText = findViewById(R.id.password_edittext);
  23.         mLoginButton = findViewById(R.id.login_button);
  24.         rEgisterButton = findViewById(R.id.register_button);
  25.    
  26.         // 跳转注册页面
  27.         rEgisterButton.setOnClickListener(new View.OnClickListener() {
  28.             @Override
  29.             public void onClick(View v) {
  30.                 Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
  31.                 startActivity(intent);
  32.                 finish();
  33.             }
  34.         });
  35.         // 登陆验证并跳转主页面
  36.         mLoginButton.setOnClickListener(new View.OnClickListener() {
  37.             @Override
  38.             public void onClick(View v) {
  39.                 // 获取输入的账号密码
  40.                 String username = mUserNameEditText.getText().toString().trim();
  41.                 String password = mPasswordEditText.getText().toString().trim();
  42.                 if (username.isEmpty() || password.isEmpty()) {
  43.                     Toast.makeText(getApplicationContext(), "请输入账号或密码", Toast.LENGTH_SHORT).show();
  44.                     return;
  45.                 }
  46.                 boolean result = mDatabaseHelper.checkUser(username, password);
  47.                 if (result) {
  48.                     Toast.makeText(getApplicationContext(), "登陆成功", Toast.LENGTH_SHORT).show();
  49.                     Intent intent = new Intent(LoginActivity.this, MainActivity.class);
  50.                     startActivity(intent);
  51.                     finish();
  52.                 } else {
  53.                     Toast.makeText(getApplicationContext(), "账号或密码错误", Toast.LENGTH_SHORT).show();
  54.                 }
  55.             }
  56.         });
  57.     }
  58. }
复制代码
       


        编译代码启动 App,在登录页面(LoginActivity)的注册按钮中点击跳转注册 页面(RegisterActivity)进行注册,注册成功后主动返回登录页面进行登录 操作,登录成功之后正常跳转主页面(MainActivity)。
步骤 7:实现主页面编写

        我们先来看activity_main.xml代码,详情结构代码如下所示:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     android:background="#c3def0"
  8.     tools:context=".Activity.MainActivity">
  9.     <FrameLayout
  10.         android:id="@+id/fr"
  11.         android:layout_width="0dp"
  12.         android:layout_height="0dp"
  13.         app:layout_constraintBottom_toTopOf="@+id/linearLayout"
  14.         app:layout_constraintEnd_toEndOf="parent"
  15.         app:layout_constraintHorizontal_bias="0.533"
  16.         app:layout_constraintStart_toStartOf="parent"
  17.         app:layout_constraintTop_toTopOf="parent">
  18.     </FrameLayout>
  19.     <LinearLayout
  20.         android:id="@+id/linearLayout"
  21.         android:layout_width="0dp"
  22.         android:layout_height="wrap_content"
  23.         android:background="#AAD3EF"
  24.         android:orientation="vertical"
  25.         app:layout_constraintBottom_toBottomOf="parent"
  26.         app:layout_constraintEnd_toEndOf="parent"
  27.         app:layout_constraintStart_toStartOf="parent">
  28.         <LinearLayout
  29.             android:layout_width="match_parent"
  30.             android:layout_height="wrap_content"
  31.             android:layout_marginTop="8dp"
  32.             android:orientation="horizontal">
  33.             <ImageView
  34.                 android:id="@+id/img_home"
  35.                 android:layout_width="25dp"
  36.                 android:layout_height="25dp"
  37.                 android:layout_weight="1"
  38.                 android:src="@drawable/home" />
  39.             <ImageView
  40.                 android:id="@+id/img_records"
  41.                 android:layout_width="25dp"
  42.                 android:layout_height="25dp"
  43.                 android:layout_weight="1"
  44.                 android:src="@drawable/records" />
  45.             <ImageView
  46.                 android:id="@+id/img_bill"
  47.                 android:layout_width="25dp"
  48.                 android:layout_height="25dp"
  49.                 android:layout_weight="1"
  50.                 android:src="@drawable/bill" />
  51.             <ImageView
  52.                 android:id="@+id/img_mine"
  53.                 android:layout_width="25dp"
  54.                 android:layout_height="25dp"
  55.                 android:layout_weight="1"
  56.                 android:src="@drawable/mine" />
  57.         </LinearLayout>
  58.         <LinearLayout
  59.             android:layout_width="match_parent"
  60.             android:layout_height="match_parent"
  61.             android:layout_marginTop="4dp"
  62.             android:layout_marginBottom="4dp"
  63.             android:orientation="horizontal">
  64.             <TextView
  65.                 android:id="@+id/tv_home"
  66.                 android:layout_width="25dp"
  67.                 android:layout_height="wrap_content"
  68.                 android:layout_weight="1"
  69.                 android:gravity="center"
  70.                 android:text="首页"
  71.                 android:textColor="#e6e6e6"
  72.                 android:textSize="8sp"
  73.                 android:textStyle="bold" />
  74.             <TextView
  75.                 android:id="@+id/tv_records"
  76.                 android:layout_width="25dp"
  77.                 android:layout_height="wrap_content"
  78.                 android:layout_weight="1"
  79.                 android:gravity="center"
  80.                 android:text="记一笔"
  81.                 android:textColor="#e6e6e6"
  82.                 android:textSize="8sp"
  83.                 android:textStyle="bold" />
  84.             <TextView
  85.                 android:id="@+id/tv_bill"
  86.                 android:layout_width="25dp"
  87.                 android:layout_height="wrap_content"
  88.                 android:layout_weight="1"
  89.                 android:gravity="center"
  90.                 android:text="历史账单"
  91.                 android:textColor="#e6e6e6"
  92.                 android:textSize="8sp"
  93.                 android:textStyle="bold" />
  94.             <TextView
  95.                 android:id="@+id/tv_mine"
  96.                 android:layout_width="25dp"
  97.                 android:layout_height="wrap_content"
  98.                 android:layout_weight="1"
  99.                 android:gravity="center"
  100.                 android:text="我的"
  101.                 android:textColor="#e6e6e6"
  102.                 android:textSize="8sp"
  103.                 android:textStyle="bold" />
  104.         </LinearLayout>
  105.     </LinearLayout>
  106. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
        接下来我们看逻辑代码,这里我们实现的是页面跳转功能,详情代码如下所示:
  1. package com.example.tallybook.Activity;
  2. import android.graphics.Color;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.FrameLayout;
  6. import android.widget.ImageView;
  7. import android.widget.TextView;
  8. import androidx.appcompat.app.AppCompatActivity;
  9. import com.example.tallybook.R;
  10. public class MainActivity extends AppCompatActivity {
  11.     private ImageView imgHome;
  12.     private ImageView imgRecords;
  13.     private ImageView imgBill;
  14.     private ImageView imgMine;
  15.     private TextView tvHome;
  16.     private TextView tvRecords;
  17.     private TextView tvBill;
  18.     private TextView tvMine;
  19.     @Override
  20.     protected void onCreate(Bundle savedInstanceState) {
  21.         super.onCreate(savedInstanceState);
  22.         setContentView(R.layout.activity_main);
  23.         initView();
  24.         Navigation();
  25.         imgHome.callOnClick();//进入页面默认点击首页
  26.     }
  27.     // 点击控件进行页面转换
  28.     private void Navigation() {
  29.         // 首页
  30.         imgHome.setOnClickListener(new View.OnClickListener() {
  31.             @Override
  32.             public void onClick(View v) {
  33.                
  34.                           }
  35.         });
  36.         // 记账页面
  37.         imgRecords.setOnClickListener(new View.OnClickListener() {
  38.             @Override
  39.             public void onClick(View v) {
  40.               
  41.                
  42.             }
  43.         });
  44.         // 历史账单页面
  45.         imgBill.setOnClickListener(new View.OnClickListener() {
  46.             @Override
  47.             public void onClick(View v) {
  48.               
  49.             
  50.             }
  51.         });
  52.         // 我的页面
  53.         imgMine.setOnClickListener(new View.OnClickListener() {
  54.             @Override
  55.             public void onClick(View v) {
  56.             
  57.                          }
  58.         });
  59.     }
  60.     }
  61.     private void initView() {
  62.         imgHome = findViewById(R.id.img_home);
  63.         imgRecords = findViewById(R.id.img_records);
  64.         imgBill = findViewById(R.id.img_bill);
  65.         imgMine = findViewById(R.id.img_mine);
  66.         tvHome = findViewById(R.id.tv_home);
  67.         tvRecords = findViewById(R.id.tv_records);
  68.         tvBill = findViewById(R.id.tv_bill);
  69.         tvMine = findViewById(R.id.tv_mine);
  70.     }
  71. }
复制代码


步骤 8:记账页面编写


        我们先来看结构代码,这里我们用到了ViewPAge列表来显示,详情代码如下所示:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     android:layout_width="match_parent"
  5.     android:layout_height="match_parent"
  6.     android:background="#c3def0"
  7.     android:orientation="vertical">
  8.     <RelativeLayout
  9.         android:layout_width="match_parent"
  10.         android:layout_height="50dp">
  11.         <com.google.android.material.tabs.TabLayout
  12.             android:id="@+id/record_tabs"
  13.             android:layout_width="wrap_content"
  14.             android:layout_height="match_parent"
  15.             android:layout_centerHorizontal="true"
  16.             app:tabGravity="center"
  17.             app:tabIndicatorColor="@color/black"
  18.             app:tabMode="fixed"
  19.             app:tabSelectedTextColor="@color/black"
  20.             app:tabTextColor="@color/grey_7D7D7D" />
  21.     </RelativeLayout>
  22.     <androidx.viewpager.widget.ViewPager
  23.         android:id="@+id/record_vp"
  24.         android:layout_width="match_parent"
  25.         android:layout_height="match_parent"
  26.         android:background="#c3def0" />
  27. </LinearLayout>
复制代码
然后我们进行逻辑代码的编写,实现显示添加付出收入记录功能
  1. package com.example.tallybook.Fragment;
  2. import android.os.Bundle;
  3. import android.view.LayoutInflater;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import androidx.annotation.NonNull;
  7. import androidx.annotation.Nullable;
  8. import androidx.fragment.app.Fragment;
  9. import androidx.viewpager.widget.ViewPager;
  10. import com.example.tallybook.Adapter.RecordPagerAdapter;
  11. import com.google.android.material.tabs.TabLayout;
  12. import com.example.tallybook.R;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. public class RecordsFragment extends Fragment {
  16.     private TabLayout tabLayout;
  17.     private ViewPager viewPager;
  18.     @Nullable
  19.     @Override
  20.     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  21.         // Inflate the layout for this fragment
  22.         View view = inflater.inflate(R.layout.fragment_records, container, false);
  23.         //1.查找控件
  24.         tabLayout = view.findViewById(R.id.record_tabs);
  25.         viewPager = view.findViewById(R.id.record_vp);
  26.         //2.设置ViewPager加载页面
  27.         initPager();
  28.         return view;
  29.     }
  30.     private void initPager() {
  31. //        创建适配器
  32.         RecordPagerAdapter pagerAdapter = new RecordPagerAdapter(getChildFragmentManager(), fragmentList);
  33. //        设置适配器
  34.         viewPager.setAdapter(pagerAdapter);
  35.         //将TabLayout和ViwePager进行关联
  36.         tabLayout.setupWithViewPager(viewPager);
  37.     }
  38. }
复制代码
步骤 9:历史记录页面编写


        这里直使用listview列表显示内容:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:background="#c3def0"
  6.     android:orientation="vertical">
  7.     <RelativeLayout
  8.         android:layout_width="match_parent"
  9.         android:layout_height="50dp">
  10.         <TextView
  11.             android:layout_width="wrap_content"
  12.             android:layout_height="wrap_content"
  13.             android:layout_centerInParent="true"
  14.             android:text="@string/history_record"
  15.             android:textColor="#4d7ea8"
  16.             android:textSize="24sp"
  17.             android:textStyle="bold" />
  18.         <ImageView
  19.             android:id="@+id/history_iv_rili"
  20.             android:layout_width="wrap_content"
  21.             android:layout_height="match_parent"
  22.             android:layout_alignParentRight="true"
  23.             android:layout_marginRight="10dp"
  24.             android:onClick="onClick"
  25.             android:src="@mipmap/it_rili" />
  26.     </RelativeLayout>
  27.     <RelativeLayout
  28.         android:layout_width="match_parent"
  29.         android:layout_height="wrap_content"
  30.         android:padding="10dp">
  31.         <TextView
  32.             android:id="@+id/history_tv_time"
  33.             android:layout_width="wrap_content"
  34.             android:layout_height="wrap_content"
  35.             android:text="2024年01月"
  36.             android:textColor="#4d7ea8"
  37.             android:textStyle="bold" />
  38.     </RelativeLayout>
  39.     <ListView
  40.         android:id="@+id/history_lv"
  41.         android:layout_width="match_parent"
  42.         android:layout_height="match_parent"
  43.         android:divider="@null"
  44.         android:dividerHeight="5dp"
  45.         android:padding="10dp" />
  46. </LinearLayout>
复制代码
然后对应的逻辑代码如下所示:

  1. package com.example.tallybook.Fragment;
  2. import android.app.AlertDialog;
  3. import android.content.DialogInterface;
  4. import android.os.Bundle;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.AdapterView;
  9. import android.widget.ImageView;
  10. import android.widget.ListView;
  11. import android.widget.TextView;
  12. import com.example.tallybook.R;
  13. import androidx.annotation.NonNull;
  14. import androidx.annotation.Nullable;
  15. import androidx.fragment.app.Fragment;
  16. import com.example.tallybook.Adapter.AccountAdapter;
  17. import com.example.tallybook.Bean.AccountBean;
  18. import com.example.tallybook.Data.DBManager;
  19. import com.example.tallybook.utils.CalendarDialog;
  20. import java.util.ArrayList;
  21. import java.util.Calendar;
  22. import java.util.List;
  23. public class BillFragment extends Fragment {
  24.     ListView historyLv;
  25.     TextView timeTv;
  26. private ImageView riliIv;
  27.     List<AccountBean> mDatas;
  28.     AccountAdapter adapter;
  29.     int year, month;
  30.     int dialogSelPos = -1;
  31.     int dialogSelMonth = -1;
  32.     @Nullable
  33.     @Override
  34.     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  35.         View view = inflater.inflate(R.layout.fragment_bill, container, false);
  36.         historyLv = view.findViewById(R.id.history_lv);
  37.         timeTv = view.findViewById(R.id.history_tv_time);
  38.         riliIv = view.findViewById(R.id.history_iv_rili);
  39.       
  40.         mDatas = new ArrayList<>();
  41.         // 设置适配器
  42.         adapter = new AccountAdapter(getActivity(), mDatas);
  43.         historyLv.setAdapter(adapter);
  44.         initTime();
  45.         timeTv.setText(year + "年" + month + "月");
  46.         loadData(year, month);
  47.         setLVClickListener();
  48.         return view;
  49.     }
  50.     /*设置ListView每一个item的长按事件*/
  51.     private void setLVClickListener() {
  52.         historyLv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
  53.             @Override
  54.             public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
  55.                 AccountBean accountBean = mDatas.get(position);
  56.                 deleteItem(accountBean);
  57.                 return false;
  58.             }
  59.         });
  60.     }
  61.   
  62.     /* 获取指定年份月份收支情况的列表*/
  63.     private void loadData(int year, int month) {
  64.         List<AccountBean> list = DBManager.getAccountListOneMonthFromAccounttb(year, month);
  65.         mDatas.clear();
  66.         mDatas.addAll(list);
  67.         adapter.notifyDataSetChanged();
  68.     }
  69.     private void initTime() {
  70.         Calendar calendar = Calendar.getInstance();
  71.         year = calendar.get(Calendar.YEAR);
  72.         month = calendar.get(Calendar.MONTH) + 1;
  73.     }
  74. }
复制代码
步骤10:我的页面的编写

       页面结构代码如下所示:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     android:background="#c3def0"
  8.     tools:context=".Fragment.MineFragment">
  9.     <ImageView
  10.         android:id="@+id/img_logo"
  11.         android:layout_width="0dp"
  12.         android:layout_height="200dp"
  13.         android:layout_marginTop="16dp"
  14.         android:src="@drawable/logo"
  15.         app:layout_constraintEnd_toEndOf="parent"
  16.         app:layout_constraintHorizontal_bias="0.0"
  17.         app:layout_constraintStart_toStartOf="parent"
  18.         app:layout_constraintTop_toTopOf="parent" />
  19.     <View
  20.         android:id="@+id/view4"
  21.         android:layout_width="0dp"
  22.         android:layout_height="50dp"
  23.         android:layout_marginStart="24dp"
  24.         android:layout_marginTop="16dp"
  25.         android:layout_marginEnd="24dp"
  26.         android:background="@drawable/fragment_home_view"
  27.         app:layout_constraintEnd_toEndOf="parent"
  28.         app:layout_constraintStart_toStartOf="parent"
  29.         app:layout_constraintTop_toBottomOf="@+id/img_logo" />
  30.     <LinearLayout
  31.         android:id="@+id/ll_clear"
  32.         android:layout_width="0dp"
  33.         android:layout_height="0dp"
  34.         android:layout_marginStart="16dp"
  35.         android:layout_marginEnd="16dp"
  36.         android:gravity="center"
  37.         android:orientation="horizontal"
  38.         app:layout_constraintBottom_toBottomOf="@+id/view4"
  39.         app:layout_constraintEnd_toEndOf="@+id/view4"
  40.         app:layout_constraintHorizontal_bias="0.39"
  41.         app:layout_constraintStart_toStartOf="@+id/view4"
  42.         app:layout_constraintTop_toTopOf="@+id/view4">
  43.         <ImageView
  44.             android:id="@+id/imageView3"
  45.             android:layout_width="35dp"
  46.             android:layout_height="35dp"
  47.             android:src="@drawable/clear" />
  48.         <TextView
  49.             android:id="@+id/textView"
  50.             android:layout_width="wrap_content"
  51.             android:layout_height="wrap_content"
  52.             android:layout_marginLeft="16dp"
  53.             android:layout_weight="1"
  54.             android:text="清空记录"
  55.             android:textColor="#183878"
  56.             android:textSize="15sp"
  57.             android:textStyle="bold" />
  58.         <ImageView
  59.             android:id="@+id/imageView4"
  60.             android:layout_width="10dp"
  61.             android:layout_height="10dp"
  62.             android:src="@drawable/jiantou" />
  63.     </LinearLayout>
  64.     <View
  65.         android:id="@+id/view11"
  66.         android:layout_width="0dp"
  67.         android:layout_height="50dp"
  68.         android:layout_marginTop="16dp"
  69.         android:background="@drawable/fragment_home_view"
  70.         app:layout_constraintEnd_toEndOf="@+id/view4"
  71.         app:layout_constraintStart_toStartOf="@+id/view4"
  72.         app:layout_constraintTop_toBottomOf="@+id/view4" />
  73.     <LinearLayout
  74.         android:id="@+id/ll_ss"
  75.         android:layout_width="0dp"
  76.         android:layout_height="0dp"
  77.         android:layout_marginStart="16dp"
  78.         android:layout_marginTop="4dp"
  79.         android:layout_marginEnd="16dp"
  80.         android:layout_marginBottom="4dp"
  81.         android:gravity="center"
  82.         android:orientation="horizontal"
  83.         app:layout_constraintBottom_toBottomOf="@+id/view11"
  84.         app:layout_constraintEnd_toEndOf="@+id/view11"
  85.         app:layout_constraintStart_toStartOf="@+id/view11"
  86.         app:layout_constraintTop_toTopOf="@+id/view11">
  87.         <ImageView
  88.             android:id="@+id/imageView8"
  89.             android:layout_width="35dp"
  90.             android:layout_height="35dp"
  91.             android:src="@drawable/ss" />
  92.         <TextView
  93.             android:id="@+id/textView10"
  94.             android:layout_width="wrap_content"
  95.             android:layout_height="wrap_content"
  96.             android:layout_marginLeft="16dp"
  97.             android:layout_weight="1"
  98.             android:text="搜索账单"
  99.             android:textColor="#183878"
  100.             android:textSize="15sp"
  101.             android:textStyle="bold" />
  102.         <ImageView
  103.             android:id="@+id/imageView9"
  104.             android:layout_width="10dp"
  105.             android:layout_height="10dp"
  106.             android:src="@drawable/jiantou" />
  107.     </LinearLayout>
  108.     <View
  109.         android:id="@+id/view"
  110.         android:layout_width="0dp"
  111.         android:layout_height="50dp"
  112.         android:layout_marginTop="16dp"
  113.         android:background="@drawable/fragment_home_view"
  114.         app:layout_constraintEnd_toEndOf="@+id/view11"
  115.         app:layout_constraintStart_toStartOf="@+id/view11"
  116.         app:layout_constraintTop_toBottomOf="@+id/view11" />
  117.     <LinearLayout
  118.         android:id="@+id/ll_statistics"
  119.         android:layout_width="0dp"
  120.         android:layout_height="0dp"
  121.         android:layout_marginStart="16dp"
  122.         android:layout_marginTop="4dp"
  123.         android:layout_marginEnd="16dp"
  124.         android:layout_marginBottom="4dp"
  125.         android:gravity="center"
  126.         android:orientation="horizontal"
  127.         app:layout_constraintBottom_toBottomOf="@+id/view"
  128.         app:layout_constraintEnd_toEndOf="@+id/view"
  129.         app:layout_constraintStart_toStartOf="@+id/view"
  130.         app:layout_constraintTop_toTopOf="@+id/view">
  131.         <ImageView
  132.             android:id="@+id/imageView10"
  133.             android:layout_width="35dp"
  134.             android:layout_height="35dp"
  135.             android:src="@drawable/tj" />
  136.         <TextView
  137.             android:id="@+id/textView2"
  138.             android:layout_width="match_parent"
  139.             android:layout_height="wrap_content"
  140.             android:layout_marginLeft="16dp"
  141.             android:layout_weight="1"
  142.             android:text="账单统计"
  143.             android:textColor="#183878"
  144.             android:textSize="15sp"
  145.             android:textStyle="bold" />
  146.         <ImageView
  147.             android:id="@+id/imageView5"
  148.             android:layout_width="10dp"
  149.             android:layout_height="10dp"
  150.             android:src="@drawable/jiantou" />
  151.     </LinearLayout>
  152.     <View
  153.         android:id="@+id/view2"
  154.         android:layout_width="0dp"
  155.         android:layout_height="50dp"
  156.         android:layout_marginTop="16dp"
  157.         android:background="@drawable/fragment_home_view"
  158.         app:layout_constraintEnd_toEndOf="@+id/view"
  159.         app:layout_constraintStart_toStartOf="@+id/view"
  160.         app:layout_constraintTop_toBottomOf="@+id/view5" />
  161.     <LinearLayout
  162.         android:id="@+id/ll_changePassword"
  163.         android:layout_width="0dp"
  164.         android:layout_height="0dp"
  165.         android:layout_marginStart="16dp"
  166.         android:layout_marginTop="4dp"
  167.         android:layout_marginEnd="16dp"
  168.         android:layout_marginBottom="4dp"
  169.         android:gravity="center"
  170.         android:orientation="horizontal"
  171.         app:layout_constraintBottom_toBottomOf="@+id/view2"
  172.         app:layout_constraintEnd_toEndOf="@+id/view2"
  173.         app:layout_constraintStart_toStartOf="@+id/view2"
  174.         app:layout_constraintTop_toTopOf="@+id/view2">
  175.         <ImageView
  176.             android:id="@+id/imageView11"
  177.             android:layout_width="35dp"
  178.             android:layout_height="35dp"
  179.             android:src="@drawable/modifypass" />
  180.         <TextView
  181.             android:id="@+id/textView3"
  182.             android:layout_width="match_parent"
  183.             android:layout_height="wrap_content"
  184.             android:layout_marginLeft="16dp"
  185.             android:layout_weight="1"
  186.             android:text="修改密码"
  187.             android:textColor="#183878"
  188.             android:textSize="15sp"
  189.             android:textStyle="bold" />
  190.         <ImageView
  191.             android:id="@+id/imageView6"
  192.             android:layout_width="10dp"
  193.             android:layout_height="10dp"
  194.             android:src="@drawable/jiantou" />
  195.     </LinearLayout>
  196.     <View
  197.         android:id="@+id/view5"
  198.         android:layout_width="0dp"
  199.         android:layout_height="50dp"
  200.         android:layout_marginTop="16dp"
  201.         android:background="@drawable/fragment_home_view"
  202.         app:layout_constraintEnd_toEndOf="@+id/view"
  203.         app:layout_constraintStart_toStartOf="@+id/view"
  204.         app:layout_constraintTop_toBottomOf="@+id/view" />
  205.     <LinearLayout
  206.         android:id="@+id/ll_budget"
  207.         android:layout_width="0dp"
  208.         android:layout_height="0dp"
  209.         android:layout_marginStart="16dp"
  210.         android:layout_marginTop="4dp"
  211.         android:layout_marginEnd="16dp"
  212.         android:layout_marginBottom="4dp"
  213.         android:gravity="center"
  214.         android:orientation="horizontal"
  215.         app:layout_constraintBottom_toBottomOf="@+id/view5"
  216.         app:layout_constraintEnd_toEndOf="@+id/view5"
  217.         app:layout_constraintStart_toStartOf="@+id/view5"
  218.         app:layout_constraintTop_toTopOf="@+id/view5">
  219.         <ImageView
  220.             android:id="@+id/imageView13"
  221.             android:layout_width="35dp"
  222.             android:layout_height="35dp"
  223.             android:src="@drawable/budget" />
  224.         <TextView
  225.             android:id="@+id/textView11"
  226.             android:layout_width="wrap_content"
  227.             android:layout_height="wrap_content"
  228.             android:layout_marginLeft="16dp"
  229.             android:layout_weight="1"
  230.             android:text="设置预算"
  231.             android:textColor="#183878"
  232.             android:textSize="15sp"
  233.             android:textStyle="bold" />
  234.         <ImageView
  235.             android:id="@+id/imageView14"
  236.             android:layout_width="10dp"
  237.             android:layout_height="10dp"
  238.             android:src="@drawable/jiantou" />
  239.     </LinearLayout>
  240.     <View
  241.         android:id="@+id/view3"
  242.         android:layout_width="0dp"
  243.         android:layout_height="50dp"
  244.         android:layout_marginTop="16dp"
  245.         android:background="@drawable/fragment_home_view"
  246.         app:layout_constraintEnd_toEndOf="@+id/view2"
  247.         app:layout_constraintHorizontal_bias="0.0"
  248.         app:layout_constraintStart_toStartOf="@+id/view2"
  249.         app:layout_constraintTop_toBottomOf="@+id/view2" />
  250.     <LinearLayout
  251.         android:id="@+id/ll_edit"
  252.         android:layout_width="0dp"
  253.         android:layout_height="0dp"
  254.         android:layout_marginStart="16dp"
  255.         android:layout_marginTop="4dp"
  256.         android:layout_marginEnd="16dp"
  257.         android:layout_marginBottom="4dp"
  258.         android:gravity="center"
  259.         android:orientation="horizontal"
  260.         app:layout_constraintBottom_toBottomOf="@+id/view3"
  261.         app:layout_constraintEnd_toEndOf="@+id/view3"
  262.         app:layout_constraintStart_toStartOf="@+id/view3"
  263.         app:layout_constraintTop_toTopOf="@+id/view3">
  264.         <ImageView
  265.             android:id="@+id/imageView12"
  266.             android:layout_width="30dp"
  267.             android:layout_height="30dp"
  268.             android:src="@drawable/edit" />
  269.         <TextView
  270.             android:id="@+id/textView4"
  271.             android:layout_width="match_parent"
  272.             android:layout_height="wrap_content"
  273.             android:layout_marginLeft="16dp"
  274.             android:layout_weight="1"
  275.             android:text="退出软件"
  276.             android:textColor="#183878"
  277.             android:textSize="15sp"
  278.             android:textStyle="bold" />
  279.         <ImageView
  280.             android:id="@+id/imageView7"
  281.             android:layout_width="10dp"
  282.             android:layout_height="10dp"
  283.             android:src="@drawable/jiantou" />
  284.     </LinearLayout>
  285. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
       
         MineFragment是一个用于显示用户个人信息和提供个人设置功能的Android Fragment类。它包含了清空账单、搜刮账单、账单统计、设置预算、修改密码和退出软件等功能。
        通过点击差别的按钮,用户可以执行相应的操作,比方删除所有记录、跳转到搜刮账单界面、跳转到账单统计界面、设置预算金额、修改密码和退出软件。此外,MineFragment还使用了DatabaseHelper类和SharedPreferences类来进行数据库操作和存储预算金额。
  1. package com.example.tallybook.Fragment;
  2. import android.app.AlertDialog;
  3. import android.content.Context;
  4. import android.content.DialogInterface;
  5. import android.content.Intent;
  6. import android.content.SharedPreferences;
  7. import android.os.Bundle;
  8. import android.text.TextUtils;
  9. import android.view.LayoutInflater;
  10. import android.view.View;
  11. import android.view.ViewGroup;
  12. import android.widget.EditText;
  13. import android.widget.LinearLayout;
  14. import android.widget.Toast;
  15. import androidx.fragment.app.Fragment;
  16. import com.example.tallybook.Activity.LoginActivity;
  17. import com.example.tallybook.Activity.SearchActivity;
  18. import com.example.tallybook.Activity.StatisticsActivity;
  19. import com.example.tallybook.Data.DBManager;
  20. import com.example.tallybook.Data.DatabaseHelper;
  21. import com.example.tallybook.R;
  22. import com.example.tallybook.utils.BudgetDialog;
  23. public class MineFragment extends Fragment {
  24.     private LinearLayout llEdit, llChangePassword, llStatistics, llClear, llSs, llBudget;
  25.     private DatabaseHelper mDatabaseHelper;
  26.     SharedPreferences preferences;
  27.     int year,month,day;
  28.     @Override
  29.     public View onCreateView(LayoutInflater inflater, ViewGroup container,
  30.                              Bundle savedInstanceState) {
  31.         View view = inflater.inflate(R.layout.fragment_mine, container, false);
  32.         initView(view);
  33.         clear();
  34.         ss();
  35.         statistics();
  36.         budget();
  37.         changePassword();
  38.         edit();
  39.         mDatabaseHelper = new DatabaseHelper(getContext());
  40.         preferences = getActivity().getSharedPreferences("budget", Context.MODE_PRIVATE);
  41.         return view;
  42.     }
  43.     // 清空账单
  44.     private void clear() {
  45.         llClear.setOnClickListener(new View.OnClickListener() {
  46.             @Override
  47.             public void onClick(View v) {
  48.                 AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
  49.                 builder.setTitle("清空提示:")
  50.                         .setMessage("您确定要删除所有记录么?\n* 删除后无法恢复,请慎重选择!")
  51.                         .setPositiveButton("取消", null)
  52.                         .setNegativeButton("确定", new DialogInterface.OnClickListener() {
  53.                             @Override
  54.                             public void onClick(DialogInterface dialog, int which) {
  55.                                 DBManager.deleteAllAccount();
  56.                                 preferences.edit().clear().apply();
  57.                                 Toast.makeText(getActivity(), "删除成功!", Toast.LENGTH_SHORT).show();
  58.                             }
  59.                         });
  60.                 builder.create().show();
  61.             }
  62.         });
  63.     }
  64.     // 搜索账单
  65.     private void ss() {
  66.         llSs.setOnClickListener(new View.OnClickListener() {
  67.             @Override
  68.             public void onClick(View v) {
  69.                 Intent it = new Intent(getActivity(), SearchActivity.class);  //跳转界面
  70.                 startActivity(it);
  71.             }
  72.         });
  73.     }
  74.     // 账单统计
  75.     private void statistics() {
  76.         llStatistics.setOnClickListener(new View.OnClickListener() {
  77.             @Override
  78.             public void onClick(View v) {
  79.                 Intent intent = new Intent(getActivity(), StatisticsActivity.class);
  80.                 startActivity(intent);
  81.             }
  82.         });
  83.     }
  84.   
  85.     private void initView(View view) {
  86.         llClear = view.findViewById(R.id.ll_clear);
  87.         llStatistics = view.findViewById(R.id.ll_statistics);
  88.         llChangePassword = view.findViewById(R.id.ll_changePassword);
  89.         llEdit = view.findViewById(R.id.ll_edit);
  90.         llSs = view.findViewById(R.id.ll_ss);
  91.         llBudget = view.findViewById(R.id.ll_budget);
  92.     }
  93. }
复制代码
步骤11:账单搜刮页面的编写


         这个页面比力简单,使用listview列表和数据库查询显示完成,我们先来看结构文件代码
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     android:background="#c3def0"
  8.     android:orientation="vertical">
  9.     <View
  10.         android:id="@+id/view10"
  11.         android:layout_width="0dp"
  12.         android:layout_height="55dp"
  13.         android:background="#4d7ea8"
  14.         app:layout_constraintEnd_toEndOf="parent"
  15.         app:layout_constraintStart_toStartOf="parent"
  16.         app:layout_constraintTop_toTopOf="parent" />
  17.     <ImageView
  18.         android:id="@+id/search_iv_back"
  19.         android:layout_width="20dp"
  20.         android:layout_height="20dp"
  21.         android:layout_marginStart="16dp"
  22.         android:onClick="onClick"
  23.         android:src="@mipmap/it_back"
  24.         app:layout_constraintBottom_toBottomOf="@+id/view10"
  25.         app:layout_constraintStart_toStartOf="parent"
  26.         app:layout_constraintTop_toTopOf="parent" />
  27.     <EditText
  28.         android:id="@+id/search_et"
  29.         android:layout_width="0dp"
  30.         android:layout_height="40dp"
  31.         android:layout_marginStart="32dp"
  32.         android:layout_marginTop="16dp"
  33.         android:layout_marginEnd="32dp"
  34.         android:background="@drawable/dialog_btn_bg"
  35.         android:hint="@string/please_search_info"
  36.         android:paddingLeft="20dp"
  37.         android:paddingTop="10dp"
  38.         android:paddingBottom="10dp"
  39.         android:textSize="16sp"
  40.         app:layout_constraintEnd_toEndOf="parent"
  41.         app:layout_constraintStart_toStartOf="parent"
  42.         app:layout_constraintTop_toBottomOf="@+id/view10">
  43.         <requestFocus />
  44.     </EditText>
  45.     <TextView
  46.         android:id="@+id/textView9"
  47.         android:layout_width="wrap_content"
  48.         android:layout_height="wrap_content"
  49.         android:text="账单搜索"
  50.         android:textColor="#c3def0"
  51.         android:textSize="24sp"
  52.         app:layout_constraintBottom_toBottomOf="@+id/view10"
  53.         app:layout_constraintEnd_toEndOf="parent"
  54.         app:layout_constraintStart_toStartOf="parent"
  55.         app:layout_constraintTop_toTopOf="@+id/view10" />
  56.     <ImageView
  57.         android:id="@+id/search_iv_sh"
  58.         android:layout_width="wrap_content"
  59.         android:layout_height="wrap_content"
  60.         android:layout_marginEnd="16dp"
  61.         android:onClick="onClick"
  62.         android:src="@mipmap/search"
  63.         app:layout_constraintBottom_toBottomOf="@+id/search_et"
  64.         app:layout_constraintEnd_toEndOf="@+id/search_et"
  65.         app:layout_constraintTop_toTopOf="@+id/search_et" />
  66.     <ListView
  67.         android:id="@+id/search_lv"
  68.         android:layout_width="0dp"
  69.         android:layout_height="0dp"
  70.         android:layout_marginStart="8dp"
  71.         android:layout_marginTop="8dp"
  72.         android:layout_marginEnd="8dp"
  73.         android:divider="#c3def0"
  74.         android:dividerHeight="6dp"
  75.         android:visibility="visible"
  76.         app:layout_constraintBottom_toBottomOf="parent"
  77.         app:layout_constraintEnd_toEndOf="parent"
  78.         app:layout_constraintStart_toStartOf="parent"
  79.         app:layout_constraintTop_toBottomOf="@+id/search_et" />
  80.     <TextView
  81.         android:id="@+id/search_tv_empty"
  82.         android:layout_width="229dp"
  83.         android:layout_height="211dp"
  84.         android:drawableTop="@mipmap/it_searchtext"
  85.         android:gravity="center"
  86.         android:text="@string/date_empty"
  87.         android:textSize="18sp"
  88.         android:visibility="visible"
  89.         app:layout_constraintBottom_toBottomOf="parent"
  90.         app:layout_constraintEnd_toEndOf="parent"
  91.         app:layout_constraintStart_toStartOf="parent"
  92.         app:layout_constraintTop_toBottomOf="@+id/search_et" />
  93. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
        通过用户输入关键词进行搜刮,并将搜刮结果显示在ListView中。该类使用了DBManager类来进行数据库操作,并使用了AccountAdapter类来显示搜刮结果。通过点击差别的按钮,用户可以执行返回和搜刮操作。
  1. package com.example.tallybook.Activity;
  2. import android.os.Bundle;
  3. import android.text.TextUtils;
  4. import android.view.View;
  5. import android.widget.EditText;
  6. import android.widget.ListView;
  7. import android.widget.TextView;
  8. import android.widget.Toast;
  9. import androidx.appcompat.app.AppCompatActivity;
  10. import com.example.tallybook.Adapter.AccountAdapter;
  11. import com.example.tallybook.Bean.AccountBean;
  12. import com.example.tallybook.Data.DBManager;
  13. import com.example.tallybook.R;
  14. import java.util.ArrayList;
  15. import java.util.List;
  16. public class SearchActivity extends AppCompatActivity {
  17.     ListView searchLv;
  18.     EditText searchEt;
  19.     TextView emptyTv;
  20.     List<AccountBean> mDatas;   //数据源
  21.     AccountAdapter adapter;    //适配器对象
  22.     @Override
  23.     protected void onCreate(Bundle savedInstanceState) {
  24.         super.onCreate(savedInstanceState);
  25.         setContentView(R.layout.activity_search);
  26.         initView();
  27.         searchLv.setEmptyView(emptyTv);   //设置无数局时,显示的控件
  28.     }
  29.     private void initView() {
  30.         searchEt = findViewById(R.id.search_et);
  31.         searchLv = findViewById(R.id.search_lv);
  32.         emptyTv = findViewById(R.id.search_tv_empty);
  33.     }
  34. }
复制代码

步骤12:统计页面的编写


这里我们还是先进行页面结构对的编写
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     android:background="#c3def0"
  8.     android:orientation="vertical"
  9.     tools:context=".Activity.StatisticsActivity">
  10.     <LinearLayout
  11.         android:layout_width="0dp"
  12.         android:layout_height="wrap_content"
  13.         android:layout_marginEnd="16dp"
  14.         android:gravity="center"
  15.         android:orientation="horizontal"
  16.         android:visibility="visible"
  17.         app:layout_constraintBottom_toTopOf="@+id/chart_vp"
  18.         app:layout_constraintEnd_toEndOf="parent"
  19.         app:layout_constraintStart_toEndOf="@+id/chart_tv_date"
  20.         app:layout_constraintTop_toBottomOf="@+id/view12">
  21.         <Button
  22.             android:id="@+id/chart_btn_out"
  23.             android:layout_width="wrap_content"
  24.             android:layout_height="20dp"
  25.             android:layout_marginRight="10dp"
  26.             android:background="@drawable/main_recordbtn_bg"
  27.             android:text="@string/out"
  28.             android:textColor="@color/white"
  29.             android:textStyle="bold" />
  30.         <Button
  31.             android:id="@+id/chart_btn_in"
  32.             android:layout_width="wrap_content"
  33.             android:layout_height="20dp"
  34.             android:layout_marginLeft="10dp"
  35.             android:background="@drawable/dialog_btn_bg"
  36.             android:text="@string/in"
  37.             android:textColor="#4d7ea8"
  38.             android:textStyle="bold" />
  39.     </LinearLayout>
  40.     <androidx.viewpager.widget.ViewPager
  41.         android:id="@+id/chart_vp"
  42.         android:layout_width="0dp"
  43.         android:layout_height="0dp"
  44.         android:layout_marginTop="24dp"
  45.         app:layout_constraintBottom_toBottomOf="parent"
  46.         app:layout_constraintEnd_toEndOf="parent"
  47.         app:layout_constraintStart_toStartOf="parent"
  48.         app:layout_constraintTop_toBottomOf="@+id/chart_tv_in" />
  49.     <View
  50.         android:id="@+id/view12"
  51.         android:layout_width="0dp"
  52.         android:layout_height="55dp"
  53.         android:background="#4d7ea8"
  54.         app:layout_constraintEnd_toEndOf="parent"
  55.         app:layout_constraintStart_toStartOf="parent"
  56.         app:layout_constraintTop_toTopOf="parent" />
  57.     <ImageView
  58.         android:id="@+id/chart_iv_back"
  59.         android:layout_width="20dp"
  60.         android:layout_height="20dp"
  61.         android:layout_marginStart="16dp"
  62.         android:src="@mipmap/it_back"
  63.         app:layout_constraintBottom_toBottomOf="@+id/view12"
  64.         app:layout_constraintStart_toStartOf="@+id/view12"
  65.         app:layout_constraintTop_toTopOf="@+id/view12" />
  66.     <TextView
  67.         android:layout_width="wrap_content"
  68.         android:layout_height="wrap_content"
  69.         android:text="@string/chart_info"
  70.         android:textColor="#c3def0"
  71.         android:textSize="24sp"
  72.         android:textStyle="bold"
  73.         app:layout_constraintBottom_toBottomOf="@+id/view12"
  74.         app:layout_constraintEnd_toEndOf="parent"
  75.         app:layout_constraintStart_toStartOf="parent"
  76.         app:layout_constraintTop_toTopOf="parent" />
  77.     <ImageView
  78.         android:id="@+id/chart_iv_rili"
  79.         android:layout_width="25dp"
  80.         android:layout_height="25dp"
  81.         android:layout_marginEnd="16dp"
  82.         android:src="@mipmap/it_rili"
  83.         app:layout_constraintBottom_toBottomOf="@+id/view12"
  84.         app:layout_constraintEnd_toEndOf="@+id/view12"
  85.         app:layout_constraintTop_toTopOf="parent" />
  86.     <TextView
  87.         android:id="@+id/chart_tv_date"
  88.         android:layout_width="wrap_content"
  89.         android:layout_height="wrap_content"
  90.         android:layout_marginStart="16dp"
  91.         android:layout_marginTop="8dp"
  92.         android:text="2024年01月账单统计"
  93.         android:textColor="#4d7ea8"
  94.         android:textSize="18sp"
  95.         android:textStyle="bold"
  96.         app:layout_constraintStart_toStartOf="parent"
  97.         app:layout_constraintTop_toBottomOf="@+id/view12" />
  98.     <TextView
  99.         android:id="@+id/chart_tv_out"
  100.         android:layout_width="wrap_content"
  101.         android:layout_height="wrap_content"
  102.         android:layout_marginTop="16dp"
  103.         android:text="共支出0笔,合计"
  104.         android:textColor="#4d7ea8"
  105.         android:textSize="14sp"
  106.         android:textStyle="bold"
  107.         app:layout_constraintStart_toStartOf="@+id/chart_tv_date"
  108.         app:layout_constraintTop_toBottomOf="@+id/chart_tv_date" />
  109.     <TextView
  110.         android:id="@+id/chart_tv_in"
  111.         android:layout_width="wrap_content"
  112.         android:layout_height="wrap_content"
  113.         android:layout_marginStart="2dp"
  114.         android:layout_marginTop="8dp"
  115.         android:gravity="top|left"
  116.         android:text="0.0"
  117.         android:textColor="#ffffff"
  118.         android:textSize="24sp"
  119.         android:textStyle="bold"
  120.         app:layout_constraintStart_toEndOf="@+id/textView14"
  121.         app:layout_constraintTop_toBottomOf="@+id/chart_tv_out" />
  122.     <TextView
  123.         android:id="@+id/textView14"
  124.         android:layout_width="wrap_content"
  125.         android:layout_height="wrap_content"
  126.         android:layout_marginTop="13dp"
  127.         android:text="¥"
  128.         android:textColor="#ffffff"
  129.         android:textSize="14sp"
  130.         android:textStyle="bold"
  131.         app:layout_constraintStart_toStartOf="@+id/chart_tv_out"
  132.         app:layout_constraintTop_toBottomOf="@+id/chart_tv_out" />
  133. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
        该活动包含了收入和付出的按钮、日期显示、统计数据显示以及ViewPager等控件。通过点击差别的按钮,用户可以切换显示收入或付出的统计数据。该活动还包含了初始化控件、初始化时间、初始化Fragment、统计数据的初始化和显示、返回按钮的点击变乱、显示日历对话框等方法。通过使用DBManager类进行数据库操作,获取收入和付出的统计数据,并使用ChartVPAdapter适配器类将Fragment添加到ViewPager中进行显示。用户可以通过点击日历图标选择差别的日期进行统计。
  1. package com.example.tallybook.Activity;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import androidx.fragment.app.Fragment;
  4. import androidx.viewpager.widget.ViewPager;
  5. import android.graphics.Color;
  6. import android.os.Bundle;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.ImageView;
  10. import android.widget.TextView;
  11. import com.example.tallybook.Adapter.ChartVPAdapter;
  12. import com.example.tallybook.Data.DBManager;
  13. import com.example.tallybook.Fragment.IncomChartFragment;
  14. import com.example.tallybook.Fragment.OutcomChartFragment;
  15. import com.example.tallybook.R;
  16. import com.example.tallybook.utils.CalendarDialog;
  17. import java.util.ArrayList;
  18. import java.util.Calendar;
  19. import java.util.List;
  20. public class StatisticsActivity extends AppCompatActivity {
  21.     Button inBtn, outBtn;
  22.     TextView dateTv, inTv, outTv;
  23.     ViewPager chartVp;
  24.     int year;
  25.     int month;
  26.     int selectPos = -1, selectMonth = -1;
  27.     List<Fragment> chartFragList;
  28.     private IncomChartFragment incomChartFragment;
  29.     private OutcomChartFragment outcomChartFragment;
  30.     private ChartVPAdapter chartVPAdapter;
  31.     private ImageView chartIV, chartBack;
  32.     private float inMoneyOneMonth, outMoneyOneMonth;
  33.     private int incountItemOneMonth, outcountItemOneMonth;
  34.     @Override
  35.     protected void onCreate(Bundle savedInstanceState) {
  36.         super.onCreate(savedInstanceState);
  37.         setContentView(R.layout.activity_statistics);
  38.         initView();
  39.         initTime();
  40.          }
  41.     // 显示日历
  42.     private void rili() {
  43.         chartIV.setOnClickListener(new View.OnClickListener() {
  44.             @Override
  45.             public void onClick(View v) {
  46.                 showCalendarDialog();
  47.             }
  48.         });
  49.     }
  50.     // 返回
  51.     private void back() {
  52.         chartBack.setOnClickListener(new View.OnClickListener() {
  53.             @Override
  54.             public void onClick(View v) {
  55.                 finish();
  56.             }
  57.         });
  58.     }
  59.     private void setVPSelectListener() {
  60.         chartVp.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
  61.             @Override
  62.             public void onPageSelected(int position) {
  63.                 setButtonStyle(position);
  64.             }
  65.         });
  66.     }
  67.     /* 统计某年某月的收支情况数据*/
  68.     private void initStatistics(int year, int month) {
  69.         inMoneyOneMonth = DBManager.getSumMoneyOneMonth(year, month, 1);  //收入总钱数
  70.         outMoneyOneMonth = DBManager.getSumMoneyOneMonth(year, month, 0); //支出总钱数
  71.         incountItemOneMonth = DBManager.getCountItemOneMonth(year, month, 1);  //收入多少笔
  72.         outcountItemOneMonth = DBManager.getCountItemOneMonth(year, month, 0); //支出多少笔
  73.         dateTv.setText(year + "年" + month + "月账单统计");
  74.         // 收入
  75.         inBtn.setOnClickListener(new View.OnClickListener() {
  76.             @Override
  77.             public void onClick(View v) {
  78.                 setButtonStyle(1);
  79.                 chartVp.setCurrentItem(1);
  80.                 outTv.setText("共收入" + incountItemOneMonth + "笔,合计");
  81.                 inTv.setText(String.valueOf(inMoneyOneMonth));
  82.             }
  83.         });
  84.         // 支出
  85.         outBtn.setOnClickListener(new View.OnClickListener() {
  86.             @Override
  87.             public void onClick(View v) {
  88.                 setButtonStyle(0);
  89.                 chartVp.setCurrentItem(0);
  90.                 outTv.setText("共支出" + outcountItemOneMonth + "笔支出,合计");
  91.                 inTv.setText(String.valueOf(outMoneyOneMonth));
  92.             }
  93.         });
  94.     }
  95.     /**
  96.      * 初始化时间的方法
  97.      */
  98.     private void initTime() {
  99.         Calendar calendar = Calendar.getInstance();
  100.         year = calendar.get(Calendar.YEAR);
  101.         month = calendar.get(Calendar.MONTH) + 1;
  102.     }
  103.     /**
  104.      * 初始化控件
  105.      */
  106.     private void initView() {
  107.         inBtn = findViewById(R.id.chart_btn_in);
  108.         outBtn = findViewById(R.id.chart_btn_out);
  109.         dateTv = findViewById(R.id.chart_tv_date);
  110.         inTv = findViewById(R.id.chart_tv_in);
  111.         outTv = findViewById(R.id.chart_tv_out);
  112.         chartVp = findViewById(R.id.chart_vp);
  113.         chartIV = findViewById(R.id.chart_iv_rili);
  114.         chartBack = findViewById(R.id.chart_iv_back);
  115.     }
  116.     /* 设置按钮样式的改变  支出-0  收入-1*/
  117.     private void setButtonStyle(int kind) {
  118.         if (kind == 0) {
  119.             outBtn.setBackgroundResource(R.drawable.main_recordbtn_bg);
  120.             outBtn.setTextColor(Color.WHITE);
  121.             inBtn.setBackgroundResource(R.drawable.dialog_btn_bg);
  122.             inBtn.setTextColor(Color.BLACK);
  123.         } else if (kind == 1) {
  124.             inBtn.setBackgroundResource(R.drawable.main_recordbtn_bg);
  125.             inBtn.setTextColor(Color.WHITE);
  126.             outBtn.setBackgroundResource(R.drawable.dialog_btn_bg);
  127.             outBtn.setTextColor(Color.BLACK);
  128.         }
  129.     }
  130. }
复制代码
         至此,完备的小熊记账本项目就创建完成了。
四、获取源码

   关注公众号《编程乐学》,后台复兴:24010601
  
  
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表