diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..26d33521af10bcc7fd8cea344038eaaeb78d0ef5
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fb7f4a8a465d42b4a0390d464b83b99e8465bba7
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
new file mode 100644
index 0000000000000000000000000000000000000000..526b4c25c6813ef690dfffafcf9a523c789c94a7
--- /dev/null
+++ b/.idea/gradle.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000000000000000000000000000000000000..27c039b26b5d0d37a9747ef9d6c56c6726817d41
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..42afabfd2abebf31384ca7797186a27a4b7dbee8
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..2709ac9b9e56e5ee1008de3625d786db8937241d
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,38 @@
+plugins {
+ id 'com.android.application'
+}
+
+android {
+ compileSdk 31
+
+ defaultConfig {
+ applicationId "com.example.bookkeeping1220"
+ minSdk 21
+ targetSdk 31
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.2.0'
+ implementation 'com.google.android.material:material:1.3.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
+ testImplementation 'junit:junit:4.+'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.2'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000000000000000000000000000000000000..481bb434814107eb79d7a30b676d344b0df2f8ce
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/app/src/androidTest/java/com/example/bookkeeping1220/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/bookkeeping1220/ExampleInstrumentedTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..a7121c97f7111596ca96b4a96dcf2eef5ccf0298
--- /dev/null
+++ b/app/src/androidTest/java/com/example/bookkeeping1220/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.example.bookkeeping1220;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("com.example.bookkeeping1220", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7059f64ea09551b540bc24c487e50e077723af22
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bookkeeping1220/AboutActivity.java b/app/src/main/java/com/example/bookkeeping1220/AboutActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..b6e7a561a85534e5faf1687f29b42867fad933bd
--- /dev/null
+++ b/app/src/main/java/com/example/bookkeeping1220/AboutActivity.java
@@ -0,0 +1,22 @@
+package com.example.bookkeeping1220;
+
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.os.Bundle;
+import android.view.View;
+
+import com.example.bookkeeping1220.R;
+
+public class AboutActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_about);
+ }
+
+ public void onClick(View view) {
+ finish();
+ }
+}
diff --git a/app/src/main/java/com/example/bookkeeping1220/AchievementActivity.java b/app/src/main/java/com/example/bookkeeping1220/AchievementActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..ce25514788a431fe38f6b0cd68ef223f174706b8
--- /dev/null
+++ b/app/src/main/java/com/example/bookkeeping1220/AchievementActivity.java
@@ -0,0 +1,201 @@
+package com.example.bookkeeping1220;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.GridView;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.example.bookkeeping1220.R;
+import com.example.bookkeeping1220.adapter.AccountAdapter;
+import com.example.bookkeeping1220.adapter.AchievementAdapter;
+import com.example.bookkeeping1220.db.AccountBean;
+import com.example.bookkeeping1220.db.AchievementBean;
+import com.example.bookkeeping1220.db.DBManager;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+public class AchievementActivity extends AppCompatActivity {
+ private GridView achieveGv;
+ AchievementAdapter achievementAdapter;
+ AccountAdapter accountAdapter;
+ List achieveDatas; //成就的bean
+ AchievementInfo[] achievementInfos; //保存上述成就对应的各项信息
+ int achieveNum;
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_achievement);
+ achieveGv = findViewById(R.id.achieve_show);
+ buildAchieveDatas();
+ achievementAdapter = new AchievementAdapter(AchievementActivity.this,achieveDatas);
+ achieveGv.setAdapter(achievementAdapter);
+ setGVLongClickListener();
+ }
+
+ /*查询对应类型对应的金额,kind为1表示收入*/
+ private static float requireDBdata(String typename, int kind) {
+ Calendar calendar = Calendar.getInstance();
+ int year = calendar.get(Calendar.YEAR);
+ float sumMoney = DBManager.getSumMoneyOneYearInOneTypename(year,kind,typename);
+ return sumMoney;
+ }
+
+ /*点击事件*/
+ public void onClick(View view) {
+ switch (view.getId()){
+ case R.id.achieve_iv_back:
+ finish();
+ break;
+ }
+ }
+
+ /** 设置GridView的点击事件*/
+ private void setGVLongClickListener() {
+ achieveGv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> adapterView, View view, int i, long l) {
+ AchievementBean clickBean = achieveDatas.get(i); //获取正在被点击的这条信息
+
+ //弹出提示用户是否删除的对话框
+ showItemDialog(clickBean);
+ }
+ });
+ }
+ private void showItemDialog(AchievementBean clickBean) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ AchievementInfo clickAchievementInfo = achievementInfos[clickBean.getId()];
+ float nowCost = requireDBdata(clickAchievementInfo.initialAchieveTypename, clickAchievementInfo.initialAchieveKind);
+
+ /*分支决定输出提示信息*/
+ if(clickAchievementInfo.initialAchieveTypename == "餐饮")
+ if (nowCost < clickAchievementInfo.initialAchieveTargetMoney) {
+ String message = "因为您吃得不够多,您餐饮消费须达到:" + clickAchievementInfo.initialAchieveTargetMoney + ",您目前消费为:" + nowCost;
+ builder.setMessage(message)
+ .setPositiveButton("确定", null);
+ builder.create().show(); //显示对话框
+ } else {
+ builder.setMessage("因为您吃够多了,称得上是" + clickBean.getTypename())
+ .setPositiveButton("确定", null);
+ builder.create().show(); //显示对话框
+ }
+
+ if(clickAchievementInfo.initialAchieveTypename == "购物")
+ if (nowCost < clickAchievementInfo.initialAchieveTargetMoney) {
+ String message = "因为您买得不够多,您购物消费须达到:" + clickAchievementInfo.initialAchieveTargetMoney + ",您目前消费为:" + nowCost;
+ builder.setMessage(message)
+ .setPositiveButton("确定", null);
+ builder.create().show(); //显示对话框
+ } else {
+ builder.setMessage("达成成就:" + clickBean.getTypename())
+ .setPositiveButton("确定", null);
+ builder.create().show(); //显示对话框
+ }
+
+ if(clickAchievementInfo.initialAchieveTypename == "奖金")
+ if (nowCost < clickAchievementInfo.initialAchieveTargetMoney) {
+ String message = "因为您赚得不够多,您奖金收入须达到:" + clickAchievementInfo.initialAchieveTargetMoney + ",您目前消费为:" + nowCost;
+ builder.setMessage(message)
+ .setPositiveButton("确定", null);
+ builder.create().show(); //显示对话框
+ } else {
+ builder.setMessage("太能赚了。。达成成就" + clickBean.getTypename())
+ .setPositiveButton("确定", null);
+ builder.create().show(); //显示对话框
+ }
+ }
+
+
+ /*成就不多,简单加载就好*/
+ private void buildAchieveDatas() {
+ achieveDatas = new ArrayList<>();
+ achievementInfos = new AchievementInfo[9];
+ /*餐饮上,分支决定加载的颜色*/
+ if(requireDBdata("餐饮",0) > 1000)
+ achievementInfos[0] = new AchievementInfo(new AchievementBean(0,"小吃货",R.drawable.cup3),"餐饮",1000,0);
+ else
+ achievementInfos[0] = new AchievementInfo(new AchievementBean(0,"小吃货",R.drawable.cup1_fs),"餐饮",1000,0);
+ if(requireDBdata("餐饮",0) > 10000)
+ achievementInfos[1] = new AchievementInfo(new AchievementBean(1,"干饭王",R.drawable.cup2),"餐饮",10000,0);
+ else
+ achievementInfos[1] = new AchievementInfo(new AchievementBean(1,"干饭王",R.drawable.cup1_fs),"餐饮",10000,0);
+ if(requireDBdata("餐饮",0) > 20000)
+ achievementInfos[2] = new AchievementInfo(new AchievementBean(2,"食神",R.drawable.cup1),"餐饮",20000,0);
+ else
+ achievementInfos[2] = new AchievementInfo(new AchievementBean(2,"食神",R.drawable.cup1_fs),"餐饮",20000,0);
+
+
+ if(requireDBdata("购物",0) > 1000)
+ achievementInfos[3] = new AchievementInfo(new AchievementBean(3,"买买买",R.drawable.cup3),"购物",1000,0);
+ else
+ achievementInfos[3] = new AchievementInfo(new AchievementBean(3,"买买买",R.drawable.cup1_fs),"购物",1000,0);
+ if(requireDBdata("购物",0) > 10000)
+ achievementInfos[4] = new AchievementInfo(new AchievementBean(4,"还能买",R.drawable.cup2),"购物",10000,0);
+ else
+ achievementInfos[4] = new AchievementInfo(new AchievementBean(4,"还能买",R.drawable.cup1_fs),"购物",10000,0);
+ if(requireDBdata("购物",0) > 20000)
+ achievementInfos[5] = new AchievementInfo(new AchievementBean(5,"太能买",R.drawable.cup1),"购物",20000,0);
+ else
+ achievementInfos[5] = new AchievementInfo(new AchievementBean(5,"太能买",R.drawable.cup1_fs),"购物",20000,0);
+
+
+ if(requireDBdata("奖金",1) > 1000)
+ achievementInfos[6] = new AchievementInfo(new AchievementBean(6,"初拿奖金",R.drawable.cup3),"奖金",1000,1);
+ else
+ achievementInfos[6] = new AchievementInfo(new AchievementBean(6,"初拿奖金",R.drawable.cup1_fs),"奖金",1000,1);
+ if(requireDBdata("奖金",1) > 10000)
+ achievementInfos[7] = new AchievementInfo(new AchievementBean(7,"奖金成山",R.drawable.cup2),"奖金",10000,1);
+ else
+ achievementInfos[7] = new AchievementInfo(new AchievementBean(7,"奖金成山",R.drawable.cup1_fs),"奖金",10000,1);
+ if(requireDBdata("奖金",1) > 200000)
+ achievementInfos[8] = new AchievementInfo(new AchievementBean(8,"奖金当工资",R.drawable.cup1),"奖金",200000,1);
+ else
+ achievementInfos[8] = new AchievementInfo(new AchievementBean(8,"奖金当工资",R.drawable.cup1_fs),"奖金",200000,1);
+
+ for(int i=0;i<9;i++)
+ achieveDatas.add(achievementInfos[i].initialAchieveData);
+ }
+
+ public static int getAchievementNum(){
+ int achieveNum = 0;
+ if(requireDBdata("餐饮",0) >= 20000)
+ achieveNum+=3;
+ else if(requireDBdata("餐饮",0) >= 10000)
+ achieveNum+=2;
+ else if(requireDBdata("餐饮",0) >= 1000)
+ achieveNum+=1;
+ if(requireDBdata("购物",0) >= 20000)
+ achieveNum+=3;
+ else if(requireDBdata("购物",0) >= 10000)
+ achieveNum+=2;
+ else if(requireDBdata("购物",0) >= 1000)
+ achieveNum+=1;
+ if(requireDBdata("奖金",1) >= 20000)
+ achieveNum+=3;
+ else if(requireDBdata("奖金",1) >= 10000)
+ achieveNum+=2;
+ else if(requireDBdata("奖金",1) >= 1000)
+ achieveNum+=1;
+ return achieveNum;
+ }
+
+ class AchievementInfo{
+ AchievementBean initialAchieveData;
+ String initialAchieveTypename;
+ float initialAchieveTargetMoney;
+ int initialAchieveKind;
+
+ public AchievementInfo(AchievementBean initialAchieveData, String initialAchieveTypename, float initialAchieveTargetMoney, int initialAchieveKind) {
+ this.initialAchieveData = initialAchieveData;
+ this.initialAchieveTypename = initialAchieveTypename;
+ this.initialAchieveTargetMoney = initialAchieveTargetMoney;
+ this.initialAchieveKind = initialAchieveKind;
+ }
+ }
+}
diff --git a/app/src/main/java/com/example/bookkeeping1220/CharactersActivity.java b/app/src/main/java/com/example/bookkeeping1220/CharactersActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..8bde0fa71526ad15b54783b3c3bbc8a2e03aef56
--- /dev/null
+++ b/app/src/main/java/com/example/bookkeeping1220/CharactersActivity.java
@@ -0,0 +1,142 @@
+package com.example.bookkeeping1220;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.Gravity;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.GridView;
+import android.widget.ListView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.example.bookkeeping1220.adapter.AccountAdapter;
+import com.example.bookkeeping1220.adapter.AchievementAdapter;
+import com.example.bookkeeping1220.adapter.CharactersAdapter;
+import com.example.bookkeeping1220.db.AccountBean;
+import com.example.bookkeeping1220.db.AchievementBean;
+import com.example.bookkeeping1220.db.CharactersBean;
+import com.example.bookkeeping1220.db.DBManager;
+import com.google.android.material.bottomnavigation.BottomNavigationView;
+
+import org.w3c.dom.CharacterData;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+public class CharactersActivity extends AppCompatActivity {
+ ListView characterLv;
+ CharactersAdapter charactersAdapter;
+ List charactersDatas;
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_characters);
+ characterLv = findViewById(R.id.characters_lv);
+ charactersDatas = new ArrayList<>();
+ buildCharacter();
+ charactersAdapter = new CharactersAdapter(CharactersActivity.this,charactersDatas);
+ characterLv.setAdapter(charactersAdapter);
+ setLVonClickListener();
+
+
+ // ZWX
+ BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
+
+ bottomNavigationView.setSelectedItemId(R.id.chat);
+
+ bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
+ @Override
+ public boolean onNavigationItemSelected(@NonNull MenuItem menuitem) {
+ switch (menuitem.getItemId()){
+ case R.id.bill:
+ startActivity(new Intent(getApplicationContext(),MainActivity.class));
+ overridePendingTransition(0,0);
+ return true;
+
+ case R.id.chat:
+ overridePendingTransition(0,0);
+ return true;
+
+ case R.id.person:
+ startActivity(new Intent(getApplicationContext(),UserActivity.class));
+ overridePendingTransition(0,0);
+ return true;
+ }
+ return false;
+ }
+ });
+ }
+
+ public void onClick(View view) {
+ }
+
+ private void setLVonClickListener() {
+ characterLv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> parent, View view, int position, long id) {
+ CharactersBean clickBean = charactersDatas.get(position); //获取正在被点击的这条信息
+
+ showScoreDialog(clickBean);
+
+ }
+ });
+ }
+
+ private void showScoreDialog(CharactersBean clickBean) {
+ if(clickBean.getIsUnlocked() == 1){
+ int myid = clickBean.getId();
+ if(myid==1){
+ Intent it = new Intent(this,TalkActivity1.class);
+ startActivity(it);
+ }
+ else if(myid==2){
+ Intent it = new Intent(this,TalkActivity2.class);
+ startActivity(it);
+ }
+ else if(myid==3){
+ Intent it = new Intent(this,TalkActivity3.class);
+ startActivity(it);
+ }
+ }else {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle("提示信息").setMessage("当前角色未解锁,你有积分"+DBManager.getUserScore()+",所需积分"+clickBean.getRequireScore())
+ .setNegativeButton("取消", null)
+ .setPositiveButton("确定", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if(DBManager.getUserScore()>clickBean.getRequireScore()){
+ int resultScore = DBManager.getUserScore()-clickBean.getRequireScore();
+ charactersDatas.get(clickBean.getId()-1).setIsUnlocked(1);
+ DBManager.renewVirtualCharacterStateFromVirtualCharactertb(charactersDatas);
+ DBManager.setScore(resultScore);
+ }else{
+ Toast toastCenter = Toast.makeText(CharactersActivity.this,"当前积分不足",Toast.LENGTH_SHORT);
+ toastCenter.setGravity(Gravity.CENTER,0,0);
+ toastCenter.show();
+ }
+ }
+ });
+ builder.create().show(); //显示对话框
+ }
+ }
+
+ void buildCharacter(){
+ charactersDatas.clear();
+ List list = DBManager.getVirtualCharacterFromVirtualCharactertb();
+ charactersDatas.addAll(list);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ buildCharacter();
+ }
+}
diff --git a/app/src/main/java/com/example/bookkeeping1220/HeadportraitActivity.java b/app/src/main/java/com/example/bookkeeping1220/HeadportraitActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..aeac5208eeb578b166082433779cfc9a488a69ba
--- /dev/null
+++ b/app/src/main/java/com/example/bookkeeping1220/HeadportraitActivity.java
@@ -0,0 +1,81 @@
+package com.example.bookkeeping1220;
+
+import android.app.AlertDialog;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.GridView;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.example.bookkeeping1220.AchievementActivity;
+import com.example.bookkeeping1220.R;
+import com.example.bookkeeping1220.adapter.AccountAdapter;
+import com.example.bookkeeping1220.adapter.AchievementAdapter;
+import com.example.bookkeeping1220.adapter.HeadportraitAdapter;
+import com.example.bookkeeping1220.db.AchievementBean;
+import com.example.bookkeeping1220.db.DBManager;
+import com.example.bookkeeping1220.db.HeadportraitBean;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+public class HeadportraitActivity extends AppCompatActivity {
+ private GridView headGv;
+ HeadportraitAdapter headportraitAdapter;
+ List headDatas; //成就的bean
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_headportrait);
+ headGv = findViewById(R.id.headportrait_show);
+ buildHeadDatas();
+ headportraitAdapter = new HeadportraitAdapter(HeadportraitActivity.this,headDatas);
+ headGv.setAdapter(headportraitAdapter);
+ setGVLongClickListener();
+ }
+
+ /*点击事件*/
+ public void onClick(View view) {
+ switch (view.getId()){
+ case R.id.headportrait_iv_back:
+ finish();
+ break;
+ }
+ }
+
+ /** 设置GridView的点击事件*/
+ private void setGVLongClickListener() {
+ headGv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> adapterView, View view, int i, long l) {
+ HeadportraitBean clickBean = headDatas.get(i); //获取正在被点击的这条信息
+ //弹出提示用户的对话框
+ showItemDialog(clickBean);
+ }
+ });
+ }
+ private void showItemDialog(HeadportraitBean clickBean) {
+ DBManager.setHead(clickBean.getsImageId(),clickBean.getHeadName());
+ finish();
+ }
+
+
+ /*头像不多,简单加载就好*/
+ private void buildHeadDatas() {
+ headDatas = new ArrayList<>();
+ headDatas.add(new HeadportraitBean(0,"1",R.drawable.portrait_1));
+ headDatas.add(new HeadportraitBean(1,"2",R.drawable.portrait_2));
+ headDatas.add(new HeadportraitBean(2,"3",R.drawable.portrait_3));
+ headDatas.add(new HeadportraitBean(3,"4",R.drawable.portrait_4));
+ headDatas.add(new HeadportraitBean(4,"5",R.drawable.portrait_5));
+ headDatas.add(new HeadportraitBean(5,"6",R.drawable.portrait_6));
+ headDatas.add(new HeadportraitBean(6,"7",R.drawable.portrait_7));
+ headDatas.add(new HeadportraitBean(6,"8",R.drawable.portrait_8));
+ headDatas.add(new HeadportraitBean(6,"超级帅的",R.drawable.portrait_9));
+ headDatas.add(new HeadportraitBean(6,"10",R.drawable.portrait_10));
+ headDatas.add(new HeadportraitBean(6,"11",R.drawable.portrait_11));
+ }
+}
diff --git a/app/src/main/java/com/example/bookkeeping1220/HistoryActivity.java b/app/src/main/java/com/example/bookkeeping1220/HistoryActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..627f57d599c4b0a121ad53e667afc3899ce60145
--- /dev/null
+++ b/app/src/main/java/com/example/bookkeeping1220/HistoryActivity.java
@@ -0,0 +1,111 @@
+package com.example.bookkeeping1220;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.example.bookkeeping1220.R;
+import com.example.bookkeeping1220.adapter.AccountAdapter;
+import com.example.bookkeeping1220.db.AccountBean;
+import com.example.bookkeeping1220.db.DBManager;
+import com.example.bookkeeping1220.utils.CalendarDialog;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+public class HistoryActivity extends AppCompatActivity {
+ ListView historyLv;
+ TextView timeTv;
+
+ ListmDatas;
+ AccountAdapter adapter;
+ int year,month;
+ int dialogSelPos = -1;
+ int dialogSelMonth = -1;
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_history);
+ historyLv = findViewById(R.id.history_lv);
+ timeTv = findViewById(R.id.history_tv_time);
+ mDatas = new ArrayList<>();
+ // 设置适配器
+ adapter = new AccountAdapter(this,mDatas);
+ historyLv.setAdapter(adapter);
+ initTime();
+ timeTv.setText(year+"年"+month+"月");
+ loadData(year,month);
+ setLVClickListener();
+ }
+ /*设置ListView每一个item的长按事件*/
+ private void setLVClickListener() {
+ historyLv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
+ @Override
+ public boolean onItemLongClick(AdapterView> parent, View view, int position, long id) {
+ AccountBean accountBean = mDatas.get(position);
+ deleteItem(accountBean);
+ return false;
+ }
+ });
+ }
+
+ private void deleteItem(final AccountBean accountBean) {
+ final int delId = accountBean.getId();
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle("提示信息").setMessage("您确定要删除这条记录么?")
+ .setNegativeButton("取消",null)
+ .setPositiveButton("确定", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ DBManager.deleteItemFromAccounttbById(delId);
+ mDatas.remove(accountBean); //实时刷新,从数据源删除
+ adapter.notifyDataSetChanged();
+ }
+ });
+ builder.create().show();
+ }
+
+ /* 获取指定年份月份收支情况的列表*/
+ private void loadData(int year,int month) {
+ List list = DBManager.getAccountListOneMonthFromAccounttb(year, month);
+ mDatas.clear();
+ mDatas.addAll(list);
+ adapter.notifyDataSetChanged();
+ }
+
+ private void initTime() {
+ Calendar calendar = Calendar.getInstance();
+ year = calendar.get(Calendar.YEAR);
+ month = calendar.get(Calendar.MONTH)+1;
+ }
+
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.history_iv_back:
+ finish();
+ break;
+ case R.id.history_iv_rili:
+ CalendarDialog dialog = new CalendarDialog(this,dialogSelPos,dialogSelMonth);
+ dialog.show();
+ dialog.setDialogSize();
+ dialog.setOnRefreshListener(new CalendarDialog.OnRefreshListener() {
+ @Override
+ public void onRefresh(int selPos, int year, int month) {
+ timeTv.setText(year+"年"+month+"月");
+ loadData(year,month);
+ dialogSelPos = selPos;
+ dialogSelMonth = month;
+ }
+ });
+ break;
+ }
+ }
+}
+
diff --git a/app/src/main/java/com/example/bookkeeping1220/MainActivity.java b/app/src/main/java/com/example/bookkeeping1220/MainActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..b3c7d95e008f498ed7da177d56c656aee93c2685
--- /dev/null
+++ b/app/src/main/java/com/example/bookkeeping1220/MainActivity.java
@@ -0,0 +1,271 @@
+package com.example.bookkeeping1220;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.text.method.HideReturnsTransformationMethod;
+import android.text.method.PasswordTransformationMethod;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.Button;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.example.bookkeeping1220.db.DBOpenHelper;
+import com.google.android.material.bottomnavigation.BottomNavigationView;
+import com.example.bookkeeping1220.R;
+import com.example.bookkeeping1220.adapter.AccountAdapter;
+import com.example.bookkeeping1220.db.AccountBean;
+import com.example.bookkeeping1220.db.DBManager;
+import com.example.bookkeeping1220.utils.BudgetDialog;
+import com.example.bookkeeping1220.utils.MoreDialog;
+import com.example.bookkeeping1220.utils.NameDialog;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+public class MainActivity extends AppCompatActivity implements View.OnClickListener {
+ ListView todayLv; //展示今日收支情况的ListView
+ ImageView searchIv;
+ Button editBtn;
+ ImageButton moreBtn;
+ //声明数据源
+ ListmDatas;
+ AccountAdapter adapter;
+ int year,month,day;
+ //头布局相关控件
+ View headerView;
+ TextView topOutTv,topInTv,topbudgetTv,topConTv;
+ ImageView topShowIv;
+ SharedPreferences preferences;
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ initTime();
+ initView();
+ preferences = getSharedPreferences("budget", Context.MODE_PRIVATE);
+ //添加ListView的头布局
+ addLVHeaderView();
+ mDatas = new ArrayList<>();
+ //设置适配器:加载每一行数据到列表当中
+ adapter = new AccountAdapter(this, mDatas);
+ todayLv.setAdapter(adapter);
+
+ //zjy new add
+ DBManager.getVirtualCharacterFromVirtualCharactertb();
+
+ // ZWX
+ BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
+
+ bottomNavigationView.setSelectedItemId(R.id.bill);
+
+ bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
+ @Override
+ public boolean onNavigationItemSelected(@NonNull MenuItem menuitem) {
+ switch (menuitem.getItemId()){
+ case R.id.bill:
+ return true;
+
+ case R.id.chat:
+ startActivity(new Intent(getApplicationContext(),CharactersActivity.class));
+ overridePendingTransition(0,0);
+ return true;
+
+ case R.id.person:
+ startActivity(new Intent(getApplicationContext(),UserActivity.class));
+ overridePendingTransition(0,0);
+ return true;
+ }
+ return false;
+ }
+ });
+ }
+ /** 初始化自带的View的方法*/
+ private void initView() {
+ todayLv = findViewById(R.id.main_lv);
+ editBtn = findViewById(R.id.main_btn_edit);
+ moreBtn = findViewById(R.id.main_btn_more);
+ searchIv = findViewById(R.id.main_iv_search);
+ editBtn.setOnClickListener(this);
+ moreBtn.setOnClickListener(this);
+ searchIv.setOnClickListener(this);
+ setLVLongClickListener();
+ }
+ /** 设置ListView的长按事件*/
+ private void setLVLongClickListener() {
+ todayLv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
+ @Override
+ public boolean onItemLongClick(AdapterView> parent, View view, int position, long id) {
+ if (position == 0) { //点击了头布局
+ return false;
+ }
+ int pos = position-1;
+ AccountBean clickBean = mDatas.get(pos); //获取正在被点击的这条信息
+
+ //弹出提示用户是否删除的对话框
+ showDeleteItemDialog(clickBean);
+ return false;
+ }
+ });
+ }
+ /* 弹出是否删除某一条记录的对话框*/
+ private void showDeleteItemDialog(final AccountBean clickBean) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle("提示信息").setMessage("您确定要删除这条记录么?")
+ .setNegativeButton("取消",null)
+ .setPositiveButton("确定", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ int click_id = clickBean.getId();
+ //执行删除的操作
+ DBManager.deleteItemFromAccounttbById(click_id);
+ mDatas.remove(clickBean); //实时刷新,移除集合当中的对象
+ adapter.notifyDataSetChanged(); //提示适配器更新数据
+ setTopTvShow(); //改变头布局TextView显示的内容
+ }
+ });
+ builder.create().show(); //显示对话框
+ }
+
+ /** 给ListView添加头布局的方法*/
+ private void addLVHeaderView() {
+ //将布局转换成View对象
+ headerView = getLayoutInflater().inflate(R.layout.item_mainlv_top, null);
+ todayLv.addHeaderView(headerView);
+ //查找头布局可用控件
+ topOutTv = headerView.findViewById(R.id.item_mainlv_top_tv_out);
+ topInTv = headerView.findViewById(R.id.item_mainlv_top_tv_in);
+ topbudgetTv = headerView.findViewById(R.id.item_mainlv_top_tv_budget);
+ topConTv = headerView.findViewById(R.id.item_mainlv_top_tv_day);
+ topShowIv = headerView.findViewById(R.id.item_mainlv_top_iv_hide);
+
+ topbudgetTv.setOnClickListener(this);
+ headerView.setOnClickListener(this);
+ topShowIv.setOnClickListener(this);
+
+ }
+ /* 获取今日的具体时间*/
+ private void initTime() {
+ Calendar calendar = Calendar.getInstance();
+ year = calendar.get(Calendar.YEAR);
+ month = calendar.get(Calendar.MONTH)+1;
+ day = calendar.get(Calendar.DAY_OF_MONTH);
+ }
+
+ // 当activity获取焦点时,会调用的方法
+ @Override
+ protected void onResume() {
+ super.onResume();
+ loadDBData();
+ setTopTvShow();
+ }
+ /* 设置头布局当中文本内容的显示*/
+ private void setTopTvShow() {
+ //获取今日支出和收入总金额,显示在view当中
+ float incomeOneDay = DBManager.getSumMoneyOneDay(year, month, day, 1);
+ float outcomeOneDay = DBManager.getSumMoneyOneDay(year, month, day, 0);
+ String infoOneDay = "今日支出 ¥"+outcomeOneDay+" 收入 ¥"+incomeOneDay;
+ topConTv.setText(infoOneDay);
+// 获取本月收入和支出总金额
+ float incomeOneMonth = DBManager.getSumMoneyOneMonth(year, month, 1);
+ float outcomeOneMonth = DBManager.getSumMoneyOneMonth(year, month, 0);
+ topInTv.setText("¥"+incomeOneMonth);
+ topOutTv.setText("¥"+outcomeOneMonth);
+
+// 设置显示运算剩余
+ float bmoney = preferences.getFloat("bmoney", 0);//预算
+ if (bmoney == 0) {
+ topbudgetTv.setText("¥ 0");
+ }else{
+ float syMoney = bmoney-outcomeOneMonth;
+ topbudgetTv.setText("¥"+syMoney);
+ }
+ }
+
+ // 加载数据库数据
+ private void loadDBData() {
+ List list = DBManager.getAccountListOneDayFromAccounttb(year, month, day);
+ mDatas.clear();
+ mDatas.addAll(list);
+ adapter.notifyDataSetChanged();
+ }
+
+
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.main_iv_search:
+ Intent it = new Intent(this, SearchActivity.class); //跳转界面
+ startActivity(it);
+ break;
+ case R.id.main_btn_edit:
+ Intent it1 = new Intent(this, RecordActivity.class); //跳转界面
+ startActivity(it1);
+ break;
+ case R.id.main_btn_more:
+ MoreDialog moreDialog = new MoreDialog(this);
+ moreDialog.show();
+ moreDialog.setDialogSize();
+ break;
+ case R.id.item_mainlv_top_tv_budget:
+ showBudgetDialog();
+ break;
+ case R.id.item_mainlv_top_iv_hide:
+ // 切换TextView明文和密文
+ toggleShow();
+ break;
+ }
+ }
+ /** 显示运算设置对话框*/
+ private void showBudgetDialog() {
+ BudgetDialog dialog = new BudgetDialog(this);
+ dialog.show();
+ dialog.setDialogSize();
+ dialog.setOnEnsureListener(new BudgetDialog.OnEnsureListener() {
+ @Override
+ public void onEnsure(float money) {
+ //将预算金额写入到共享参数当中,进行存储
+ SharedPreferences.Editor editor = preferences.edit();
+ editor.putFloat("bmoney",money);
+ editor.commit();
+ //计算剩余金额
+ float outcomeOneMonth = DBManager.getSumMoneyOneMonth(year, month, 0);
+ float syMoney = money-outcomeOneMonth;//预算剩余 = 预算-支出
+ topbudgetTv.setText("¥"+syMoney);
+ }
+ });
+ }
+
+ boolean isShow = true;
+ /**
+ * 点击头布局眼睛时,如果原来是明文,就加密,如果是密文,就显示出来
+ * */
+ private void toggleShow() {
+ if (isShow) { //明文====》密文
+ PasswordTransformationMethod passwordMethod = PasswordTransformationMethod.getInstance();
+ topInTv.setTransformationMethod(passwordMethod); //设置隐藏
+ topOutTv.setTransformationMethod(passwordMethod); //设置隐藏
+ topbudgetTv.setTransformationMethod(passwordMethod); //设置隐藏
+ topShowIv.setImageResource(R.mipmap.ih_hide);
+ isShow = false; //设置标志位为隐藏状态
+ }else{ //密文---》明文
+ HideReturnsTransformationMethod hideMethod = HideReturnsTransformationMethod.getInstance();
+ topInTv.setTransformationMethod(hideMethod); //设置隐藏
+ topOutTv.setTransformationMethod(hideMethod); //设置隐藏
+ topbudgetTv.setTransformationMethod(hideMethod); //设置隐藏
+ topShowIv.setImageResource(R.mipmap.ih_show);
+ isShow = true; //设置标志位为隐藏状态
+ }
+ }
+}
diff --git a/app/src/main/java/com/example/bookkeeping1220/RecordActivity.java b/app/src/main/java/com/example/bookkeeping1220/RecordActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..86b33834857108097e3ac7aadb88092501e013a2
--- /dev/null
+++ b/app/src/main/java/com/example/bookkeeping1220/RecordActivity.java
@@ -0,0 +1,60 @@
+package com.example.bookkeeping1220;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.fragment.app.Fragment;
+import androidx.viewpager.widget.ViewPager;
+
+import android.os.Bundle;
+import android.view.View;
+
+import com.google.android.material.tabs.TabLayout;
+import com.example.bookkeeping1220.R;
+import com.example.bookkeeping1220.adapter.RecordPagerAdapter;
+import com.example.bookkeeping1220.frag_record.IncomeFragment;
+import com.example.bookkeeping1220.frag_record.BaseRecordFragment;
+import com.example.bookkeeping1220.frag_record.OutcomeFragment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RecordActivity extends AppCompatActivity {
+ TabLayout tabLayout;
+ ViewPager viewPager;
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_record);
+ //1.查找控件
+ tabLayout = findViewById(R.id.record_tabs);
+ viewPager = findViewById(R.id.record_vp);
+ //2.设置ViewPager加载页面
+ initPager();
+ }
+
+ private void initPager() {
+// 初始化ViewPager页面的集合
+ ListfragmentList = new ArrayList<>();
+// 创建收入和支出页面,放置在Fragment当中
+ OutcomeFragment outFrag = new OutcomeFragment(); //支出
+ IncomeFragment inFrag = new IncomeFragment(); //收入
+ fragmentList.add(outFrag);
+ fragmentList.add(inFrag);
+
+// 创建适配器
+ RecordPagerAdapter pagerAdapter = new RecordPagerAdapter(getSupportFragmentManager(), fragmentList);
+// 设置适配器
+ viewPager.setAdapter(pagerAdapter);
+ //将TabLayout和ViwePager进行关联
+ tabLayout.setupWithViewPager(viewPager);
+ }
+
+ /* 点击事件*/
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.record_iv_back:
+ finish();
+ break;
+ }
+ }
+}
+
diff --git a/app/src/main/java/com/example/bookkeeping1220/SearchActivity.java b/app/src/main/java/com/example/bookkeeping1220/SearchActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f5b09930edc8c47913546885fd7fe712d162099
--- /dev/null
+++ b/app/src/main/java/com/example/bookkeeping1220/SearchActivity.java
@@ -0,0 +1,63 @@
+package com.example.bookkeeping1220;
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.example.bookkeeping1220.R;
+import com.example.bookkeeping1220.adapter.AccountAdapter;
+import com.example.bookkeeping1220.db.AccountBean;
+import com.example.bookkeeping1220.db.DBManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SearchActivity extends AppCompatActivity {
+ ListView searchLv;
+ EditText searchEt;
+ TextView emptyTv;
+ ListmDatas; //数据源
+ AccountAdapter adapter; //适配器对象
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_search);
+ initView();
+ mDatas = new ArrayList<>();
+ adapter = new AccountAdapter(this,mDatas);
+ searchLv.setAdapter(adapter);
+ searchLv.setEmptyView(emptyTv); //设置无数局时,显示的控件
+ }
+
+ private void initView() {
+ searchEt = findViewById(R.id.search_et);
+ searchLv = findViewById(R.id.search_lv);
+ emptyTv = findViewById(R.id.search_tv_empty);
+ }
+
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.search_iv_back:
+ finish();
+ break;
+ case R.id.search_iv_sh: //执行搜索的操作
+ String msg = searchEt.getText().toString().trim();
+// 判断输入内容是否为空,如果为空,就提示不能搜索
+ if (TextUtils.isEmpty(msg)) {
+ Toast.makeText(this,"输入内容不能为空!",Toast.LENGTH_SHORT).show();
+ return;
+ }
+ //开始搜索
+ List list = DBManager.getAccountListByRemarkFromAccounttb(msg);
+ mDatas.clear();
+ mDatas.addAll(list);
+ adapter.notifyDataSetChanged();
+ break;
+ }
+ }
+}
diff --git a/app/src/main/java/com/example/bookkeeping1220/SettingActivity.java b/app/src/main/java/com/example/bookkeeping1220/SettingActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..9823f1097675e386a0a82a926e5a507feed026cf
--- /dev/null
+++ b/app/src/main/java/com/example/bookkeeping1220/SettingActivity.java
@@ -0,0 +1,47 @@
+package com.example.bookkeeping1220;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Toast;
+
+import com.example.bookkeeping1220.R;
+import com.example.bookkeeping1220.db.DBManager;
+
+public class SettingActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_setting);
+ }
+
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.setting_iv_back:
+ finish();
+ break;
+ case R.id.setting_tv_clear:
+ showDeleteDialog();
+ break;
+ }
+ }
+
+ private void showDeleteDialog() {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle("删除提示")
+ .setMessage("您确定要删除所有记录么?\n注意:删除后无法恢复,请慎重选择!")
+ .setPositiveButton("取消",null)
+ .setNegativeButton("确定", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ DBManager.deleteAllAccount();
+ Toast.makeText(SettingActivity.this,"删除成功!",Toast.LENGTH_SHORT).show();
+ }
+ });
+ builder.create().show();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bookkeeping1220/TalkActivity.java b/app/src/main/java/com/example/bookkeeping1220/TalkActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..828e3fe5e4a89c30faf0a44205f52a6caf564300
--- /dev/null
+++ b/app/src/main/java/com/example/bookkeeping1220/TalkActivity.java
@@ -0,0 +1,89 @@
+package com.example.bookkeeping1220;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.SimpleAdapter;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class TalkActivity extends AppCompatActivity implements View.OnClickListener {
+ private EditText inputEditText;
+ private SimpleAdapter simpleAdapter;
+ List