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> list=new ArrayList>(); + ImageView backArrow; + ListView listView2; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_talk); + Context context = this; + initView(); + TextView nameTextView = findViewById(R.id.NameTextView); + Intent intent=getIntent(); //? + String name=intent.getStringExtra("name"); + nameTextView.setText(name); + } + + private void initView() { + inputEditText=findViewById(R.id.inputEditText); + Button sendButton = findViewById(R.id.sendButton); + listView2 = findViewById(R.id.listView2); + listView2.setDivider(null); + simpleAdapter=new SimpleAdapter(this,list,R.layout.item_talking_opposite,new String[]{"message"},new int[]{R.id.talkTextViewLeft}); + listView2.setAdapter(simpleAdapter); + sendButton.setOnClickListener(this); + backArrow = findViewById(R.id.chat_backarrow); + backArrow.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + switch(view.getId()){ + case R.id.chat_backarrow: + finish(); + break; + case R.id.sendButton: + listView2.setAdapter(simpleAdapter); + sendMessage(); + handler.sendEmptyMessage(0); + break; + } + } + + public void sendMessage(){ + String message=inputEditText.getText().toString(); + if (message.length()>0){ + HashMap map = new HashMap<>(); + map.put("message",message); + list.add(map); + inputEditText.setText(""); + } + } + + + Handler handler=new Handler(){ + @Override + public void handleMessage(@NonNull Message msg) { + simpleAdapter.notifyDataSetChanged(); + } + }; +} + diff --git a/app/src/main/java/com/example/bookkeeping1220/TalkActivity1.java b/app/src/main/java/com/example/bookkeeping1220/TalkActivity1.java new file mode 100644 index 0000000000000000000000000000000000000000..028db36db5f8b667312e84967202fab54862bdfa --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/TalkActivity1.java @@ -0,0 +1,87 @@ +package com.example.bookkeeping1220; + +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 TalkActivity1 extends AppCompatActivity implements View.OnClickListener { + private EditText inputEditText; + private SimpleAdapter simpleAdapter; + private SimpleAdapter simpleAdapter1; + List> list=new ArrayList>(); + ImageView backArrow; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_talk); + Context context = this; + initView(); + TextView nameTextView = findViewById(R.id.NameTextView); + Intent intent=getIntent(); //? + String name=intent.getStringExtra("name"); + nameTextView.setText("蜡笔小新"); + } + + private void initView() { + inputEditText=findViewById(R.id.inputEditText); + Button sendButton = findViewById(R.id.sendButton); + ListView listView2 = findViewById(R.id.listView2); + listView2.setDivider(null); + simpleAdapter=new SimpleAdapter(this,list, R.layout.item_talking_opposite,new String[]{"message"},new int[]{R.id.talkTextViewLeft}); + listView2.setAdapter(simpleAdapter); +// simpleAdapter1 = new SimpleAdapter(this,list,R.layout.item_talking,new String[]{"message"},new int[]{R.id.talkTextView}); +// listView2.setAdapter(simpleAdapter1); + sendButton.setOnClickListener(this); + backArrow = findViewById(R.id.chat_backarrow); + backArrow.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + switch(view.getId()){ + case R.id.sendButton: + sendMessage(); + handler.sendEmptyMessage(0); + break; + case R.id.chat_backarrow: + finish(); + break; + } + } + + public void sendMessage(){ + String message=inputEditText.getText().toString(); + if (message.length()>0){ + HashMap map = new HashMap<>(); + map.put("message",message); + list.add(map); + inputEditText.setText(""); + } + } + + Handler handler=new Handler(){ + @Override + public void handleMessage(@NonNull Message msg) { + simpleAdapter.notifyDataSetChanged(); + } + }; +} diff --git a/app/src/main/java/com/example/bookkeeping1220/TalkActivity2.java b/app/src/main/java/com/example/bookkeeping1220/TalkActivity2.java new file mode 100644 index 0000000000000000000000000000000000000000..60e5801184f1b822bd58dc93c8820d39b6e9c967 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/TalkActivity2.java @@ -0,0 +1,87 @@ +package com.example.bookkeeping1220; + +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 TalkActivity2 extends AppCompatActivity implements View.OnClickListener { + private EditText inputEditText; + private SimpleAdapter simpleAdapter; + private SimpleAdapter simpleAdapter1; + List> list=new ArrayList>(); + ImageView backArrow; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_talk); + Context context = this; + initView(); + TextView nameTextView = findViewById(R.id.NameTextView); + Intent intent=getIntent(); //? + String name=intent.getStringExtra("name"); + nameTextView.setText("哆啦A梦"); + } + + private void initView() { + inputEditText=findViewById(R.id.inputEditText); + Button sendButton = findViewById(R.id.sendButton); + ListView listView2 = findViewById(R.id.listView2); + listView2.setDivider(null); + simpleAdapter=new SimpleAdapter(this,list, R.layout.item_talking_opposite,new String[]{"message"},new int[]{R.id.talkTextViewLeft}); + listView2.setAdapter(simpleAdapter); +// simpleAdapter1 = new SimpleAdapter(this,list,R.layout.item_talking,new String[]{"message"},new int[]{R.id.talkTextView}); +// listView2.setAdapter(simpleAdapter1); + sendButton.setOnClickListener(this); + backArrow = findViewById(R.id.chat_backarrow); + backArrow.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + switch(view.getId()){ + case R.id.sendButton: + sendMessage(); + handler.sendEmptyMessage(0); + break; + case R.id.chat_backarrow: + finish(); + break; + } + } + + public void sendMessage(){ + String message=inputEditText.getText().toString(); + if (message.length()>0){ + HashMap map = new HashMap<>(); + map.put("message",message); + list.add(map); + inputEditText.setText(""); + } + } + + Handler handler=new Handler(){ + @Override + public void handleMessage(@NonNull Message msg) { + simpleAdapter.notifyDataSetChanged(); + } + }; +} diff --git a/app/src/main/java/com/example/bookkeeping1220/TalkActivity3.java b/app/src/main/java/com/example/bookkeeping1220/TalkActivity3.java new file mode 100644 index 0000000000000000000000000000000000000000..40992d069b4d10ca60d1e517571b2668c691516e --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/TalkActivity3.java @@ -0,0 +1,87 @@ +package com.example.bookkeeping1220; + +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 TalkActivity3 extends AppCompatActivity implements View.OnClickListener { + private EditText inputEditText; + private SimpleAdapter simpleAdapter; + private SimpleAdapter simpleAdapter1; + List> list=new ArrayList>(); + ImageView backArrow; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_talk); + Context context = this; + initView(); + TextView nameTextView = findViewById(R.id.NameTextView); + Intent intent=getIntent(); //? + String name=intent.getStringExtra("name"); + nameTextView.setText("生产队的大萝卜"); + } + + private void initView() { + inputEditText=findViewById(R.id.inputEditText); + Button sendButton = findViewById(R.id.sendButton); + ListView listView2 = findViewById(R.id.listView2); + listView2.setDivider(null); + simpleAdapter=new SimpleAdapter(this,list, R.layout.item_talking_opposite,new String[]{"message"},new int[]{R.id.talkTextViewLeft}); + listView2.setAdapter(simpleAdapter); +// simpleAdapter1 = new SimpleAdapter(this,list,R.layout.item_talking,new String[]{"message"},new int[]{R.id.talkTextView}); +// listView2.setAdapter(simpleAdapter1); + sendButton.setOnClickListener(this); + backArrow = findViewById(R.id.chat_backarrow); + backArrow.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + switch(view.getId()){ + case R.id.sendButton: + sendMessage(); + handler.sendEmptyMessage(0); + break; + case R.id.chat_backarrow: + finish(); + break; + } + } + + public void sendMessage(){ + String message=inputEditText.getText().toString(); + if (message.length()>0){ + HashMap map = new HashMap<>(); + map.put("message",message); + list.add(map); + inputEditText.setText(""); + } + } + + Handler handler=new Handler(){ + @Override + public void handleMessage(@NonNull Message msg) { + simpleAdapter.notifyDataSetChanged(); + } + }; +} diff --git a/app/src/main/java/com/example/bookkeeping1220/UniteApp.java b/app/src/main/java/com/example/bookkeeping1220/UniteApp.java new file mode 100644 index 0000000000000000000000000000000000000000..a568b719940d72ac02d58d285b0741d6c0e38eca --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/UniteApp.java @@ -0,0 +1,14 @@ +package com.example.bookkeeping1220; +import android.app.Application; + +import com.example.bookkeeping1220.db.DBManager; + +/* 表示全局应用的类*/ +public class UniteApp extends Application { + @Override + public void onCreate() { + super.onCreate(); + // 初始化数据库 + DBManager.initDB(getApplicationContext()); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bookkeeping1220/UserActivity.java b/app/src/main/java/com/example/bookkeeping1220/UserActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..e4be245ac483a324f7de9ed596505ccdcf411747 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/UserActivity.java @@ -0,0 +1,179 @@ +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.view.Gravity; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import com.google.android.material.bottomnavigation.BottomNavigationView; +import com.example.bookkeeping1220.R; +import com.example.bookkeeping1220.db.AccountBean; +import com.example.bookkeeping1220.db.AchievementBean; +import com.example.bookkeeping1220.db.DBManager; +import com.example.bookkeeping1220.utils.BudgetDialog; +import com.example.bookkeeping1220.HeadportraitActivity; +import com.example.bookkeeping1220.utils.NameDialog; + +public class UserActivity extends AppCompatActivity { + TextView nameTv; + TextView signTv; + TextView achievementTv; + ImageView headIv; + Button achievementBtn; + Button scoreBtn; + SharedPreferences preferences; + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_individual); + nameTv=findViewById(R.id.username_user); + signTv=findViewById(R.id.sign_user); + headIv=findViewById(R.id.head_portrait); + achievementBtn=findViewById(R.id.user_achievement); + achievementTv=findViewById(R.id.user_simple_achievement); + scoreBtn=findViewById(R.id.user_score); + preferences = getSharedPreferences("修改信息", Context.MODE_PRIVATE); + if(DBManager.getUserName() != null){ + nameTv.setText(DBManager.getUserName()); + } + if(DBManager.getUserSign() != null){ + signTv.setText(DBManager.getUserSign()); + } + if(DBManager.getUserHead() != -1){ + headIv.setImageResource(DBManager.getUserHead()); + } + int achieveNum = AchievementActivity.getAchievementNum(); + achievementTv.setText("成就达成:"+achieveNum); + scoreBtn.setText("当前积分为:"+DBManager.getUserScore()); + setNameTvLongClickListener(); + setSignTvLongClickListener(); + setHeadIvLongClickListener(); + + // ZWX + BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation); + + bottomNavigationView.setSelectedItemId(R.id.person); + + 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: + startActivity(new Intent(getApplicationContext(),CharactersActivity.class)); + overridePendingTransition(0,0); + return true; + + case R.id.person: + return true; + } + return false; + } + }); + } + + public void onClick(View view) { + switch (view.getId()){ + case R.id.user_achievement: + Intent it = new Intent(this, AchievementActivity.class); //跳转界面 + startActivity(it); + break; + case R.id.user_score: + int theScore = DBManager.getUserScore(); + Toast toastCenter = Toast.makeText(UserActivity.this,"当前积分为:"+DBManager.getUserScore(),Toast.LENGTH_LONG); + toastCenter.setGravity(Gravity.CENTER,0,0); + toastCenter.show(); + break; + } + + } + + private void setNameTvLongClickListener() { + nameTv.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View view) { + longClickToChangeTheText(0); + return true; + } + }); + } + + private void setSignTvLongClickListener() { + signTv.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View view) { + longClickToChangeTheText(1); + return true; + } + }); + } + + private void setHeadIvLongClickListener() { + headIv.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View view) { + Intent it = new Intent(UserActivity.this, HeadportraitActivity.class); //跳转界面 + startActivity(it); + return true; + } + }); + } + @Override + protected void onResume() { + super.onResume(); + if(DBManager.getUserName() != null){ + nameTv.setText(DBManager.getUserName()); + } + if(DBManager.getUserSign() != null){ + signTv.setText(DBManager.getUserSign()); + } + if(DBManager.getUserHead() != -1){ + headIv.setImageResource(DBManager.getUserHead()); + } + } + + private void longClickToChangeTheText(int flag) { + if(flag == 0){ + NameDialog dialog = new NameDialog(this); + dialog.show(); + dialog.setDialogSize(); + dialog.setOnEnsureListener(new NameDialog.OnEnsureListener() { + @Override + public void onEnsure(String name) { + nameTv.setText(name); + DBManager.setName(name); + } + }); + }else if(flag == 1){ + NameDialog dialog = new NameDialog(this); + dialog.show(); + dialog.setDialogSize(); + dialog.setOnEnsureListener(new NameDialog.OnEnsureListener() { + @Override + public void onEnsure(String sign) { + signTv.setText(sign); + DBManager.setSign(sign); + } + }); + } + } +} diff --git a/app/src/main/java/com/example/bookkeeping1220/adapter/AccountAdapter.java b/app/src/main/java/com/example/bookkeeping1220/adapter/AccountAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..f195e4840ed9f117b024e73912e23c4c2420a3d8 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/adapter/AccountAdapter.java @@ -0,0 +1,83 @@ +package com.example.bookkeeping1220.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.example.bookkeeping1220.R; +import com.example.bookkeeping1220.db.AccountBean; + +import java.util.Calendar; +import java.util.List; + +public class AccountAdapter extends BaseAdapter { + Context context; + ListmDatas; + LayoutInflater inflater; + int year,month,day; + public AccountAdapter(Context context, List mDatas) { + this.context = context; + this.mDatas = mDatas; + inflater = LayoutInflater.from(context); + Calendar calendar = Calendar.getInstance(); + year = calendar.get(Calendar.YEAR); + month = calendar.get(Calendar.MONTH)+1; + day = calendar.get(Calendar.DAY_OF_MONTH); + } + + @Override + public int getCount() { + return mDatas.size(); + } + + @Override + public Object getItem(int position) { + return mDatas.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ViewHolder holder = null; + if (convertView == null) { + convertView = inflater.inflate(R.layout.item_mainlv,parent,false); + holder = new ViewHolder(convertView); + convertView.setTag(holder); + }else{ + holder = (ViewHolder) convertView.getTag(); + } + AccountBean bean = mDatas.get(position); + holder.typeIv.setImageResource(bean.getsImageId()); + holder.typeTv.setText(bean.getTypename()); + holder.beizhuTv.setText(bean.getBeizhu()); + holder.moneyTv.setText("¥ "+bean.getMoney()); + if (bean.getYear()==year&&bean.getMonth()==month&&bean.getDay()==day) { + String time = bean.getTime().split(" ")[1]; + holder.timeTv.setText("今天 "+time); + }else { + holder.timeTv.setText(bean.getTime()); + } + return convertView; + } + + class ViewHolder{ + ImageView typeIv; + TextView typeTv,beizhuTv,timeTv,moneyTv; + public ViewHolder(View view){ + typeIv = view.findViewById(R.id.item_mainlv_iv); + typeTv = view.findViewById(R.id.item_mainlv_tv_title); + timeTv = view.findViewById(R.id.item_mainlv_tv_time); + beizhuTv = view.findViewById(R.id.item_mainlv_tv_beizhu); + moneyTv = view.findViewById(R.id.item_mainlv_tv_money); + + } + } +} diff --git a/app/src/main/java/com/example/bookkeeping1220/adapter/AchievementAdapter.java b/app/src/main/java/com/example/bookkeeping1220/adapter/AchievementAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..5bc9feb9cb238e94f8fc2d230f50b58a5617a4db --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/adapter/AchievementAdapter.java @@ -0,0 +1,73 @@ +package com.example.bookkeeping1220.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.example.bookkeeping1220.R; +import com.example.bookkeeping1220.db.AccountBean; +import com.example.bookkeeping1220.db.AchievementBean; + +import java.util.Calendar; +import java.util.List; + +public class AchievementAdapter extends BaseAdapter { + + Context context; + ListmDatas; + LayoutInflater layoutInflater; + + public AchievementAdapter(Context context){ + this.context = context; + layoutInflater = LayoutInflater.from(context); + } + + public AchievementAdapter(Context context, List mDatas) { + this.context = context; + this.mDatas = mDatas; + layoutInflater = LayoutInflater.from(context); + } + + @Override + public int getCount() { + return mDatas.size(); + } + + @Override + public Object getItem(int i) { + return mDatas.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + class ViewHolder{ + public ImageView achieveIv; + public TextView achieveTv; + ViewHolder(View view){ + achieveIv = view.findViewById(R.id.item_achievement_gv_iv); + achieveTv = view.findViewById(R.id.item_achievement_gv_title); + } + } + @Override + public View getView(int i, View convertView, ViewGroup parent) { + ViewHolder holder = null; + if (convertView == null){ + convertView = layoutInflater.inflate(R.layout.item_achievement_gv,parent,false); + holder = new ViewHolder(convertView); + convertView.setTag(holder); + }else{ + holder = (ViewHolder) convertView.getTag(); + } + AchievementBean bean = mDatas.get(i); + holder.achieveTv.setText(bean.getTypename()); + holder.achieveIv.setImageResource(bean.getsImageId()); + return convertView; + } +} diff --git a/app/src/main/java/com/example/bookkeeping1220/adapter/CalendarAdapter.java b/app/src/main/java/com/example/bookkeeping1220/adapter/CalendarAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..6955d5d6f0b3702ca5f32ab159464aa77369bd37 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/adapter/CalendarAdapter.java @@ -0,0 +1,76 @@ +package com.example.bookkeeping1220.adapter; + +import android.content.Context; +import android.graphics.Color; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import androidx.core.content.ContextCompat; + +import com.example.bookkeeping1220.R; + +import java.util.ArrayList; +import java.util.List; + +/* + * 历史账单界面,点击日历表,弹出对话框,当中的GridView对应的适配器 + * */ +public class CalendarAdapter extends BaseAdapter { + Context context; + ListmDatas; + public int year; + public int selPos = -1; + + public void setYear(int year) { + this.year = year; + mDatas.clear(); + loadDatas(year); + notifyDataSetChanged(); + } + + public CalendarAdapter(Context context, int year) { + this.context = context; + this.year = year; + mDatas = new ArrayList<>(); + loadDatas(year); + } + + private void loadDatas(int year) { + for (int i = 1; i < 13; i++) { + String data = year+"/"+i; + mDatas.add(data); + } + } + + @Override + public int getCount() { + return mDatas.size(); + } + + @Override + public Object getItem(int position) { + return mDatas.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + convertView = LayoutInflater.from(context).inflate(R.layout.item_dialogcal_gv,parent,false); + TextView tv = convertView.findViewById(R.id.item_dialogcal_gv_tv); + tv.setText(mDatas.get(position)); + tv.setBackgroundResource(R.color.grey_f3f3f3); + tv.setTextColor(Color.BLACK); + if (position == selPos) { + tv.setBackgroundResource(R.color.green_006400); + tv.setTextColor(Color.WHITE); + } + return convertView; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bookkeeping1220/adapter/CharactersAdapter.java b/app/src/main/java/com/example/bookkeeping1220/adapter/CharactersAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..aa68736ca6cf5cebf2bc631a22081de1201d48ac --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/adapter/CharactersAdapter.java @@ -0,0 +1,70 @@ +package com.example.bookkeeping1220.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.example.bookkeeping1220.R; +import com.example.bookkeeping1220.db.CharactersBean; + +import java.util.List; + +public class CharactersAdapter extends BaseAdapter { + Context context; + List mDatas; + LayoutInflater layoutInflater; + + public CharactersAdapter(Context context){ + this.context = context; + layoutInflater = LayoutInflater.from(context); + } + + public CharactersAdapter(Context context, List mDatas) { + this.context = context; + this.mDatas = mDatas; + layoutInflater = LayoutInflater.from(context); + } + + @Override + public int getCount() { + return mDatas.size(); + } + + @Override + public Object getItem(int i) { + return mDatas.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + class ViewHolder{ + public ImageView headIv; + public TextView nameTv; + ViewHolder(View view){ + headIv = view.findViewById(R.id.item_character_head); + nameTv = view.findViewById(R.id.item_character_name); + } + } + @Override + public View getView(int i, View convertView, ViewGroup parent) { + CharactersAdapter.ViewHolder holder = null; + if (convertView == null){ + convertView = layoutInflater.inflate(R.layout.item_characters_one_character_lv,parent,false); + holder = new CharactersAdapter.ViewHolder(convertView); + convertView.setTag(holder); + }else{ + holder = (CharactersAdapter.ViewHolder) convertView.getTag(); + } + CharactersBean bean = mDatas.get(i); + holder.nameTv.setText(bean.getName()); + holder.headIv.setImageResource(bean.getsImageId()); + return convertView; + } +} diff --git a/app/src/main/java/com/example/bookkeeping1220/adapter/ChartItemAdapter.java b/app/src/main/java/com/example/bookkeeping1220/adapter/ChartItemAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..70ceb7681c6099c1b8e7c586bd201a9e2d954f5f --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/adapter/ChartItemAdapter.java @@ -0,0 +1,78 @@ +package com.example.bookkeeping1220.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; + +import com.example.bookkeeping1220.R; +import com.example.bookkeeping1220.db.ChartItemBean; +import com.example.bookkeeping1220.utils.FloatUtils; + +import java.util.List; + +/* + * 账单详情页面,listview的适配器 + * */ +public class ChartItemAdapter extends BaseAdapter { + Context context; + List mDatas; + LayoutInflater inflater; + public ChartItemAdapter(Context context, List mDatas) { + this.context = context; + this.mDatas = mDatas; + inflater = LayoutInflater.from(context); + } + + @Override + public int getCount() { + return mDatas.size(); + } + + @Override + public Object getItem(int position) { + return mDatas.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ViewHolder holder = null; + if (convertView == null) { + convertView = inflater.inflate(R.layout.item_chartfrag_lv,parent,false); + holder = new ViewHolder(convertView); + convertView.setTag(holder); + }else{ + holder = (ViewHolder) convertView.getTag(); + } +// 获取显示内容 + ChartItemBean bean = mDatas.get(position); + holder.iv.setImageResource(bean.getsImageId()); + holder.typeTv.setText(bean.getType()); + float ratio = bean.getRatio(); + String pert = FloatUtils.ratioToPercent(ratio); + holder.ratioTv.setText(pert); + + holder.totalTv.setText("¥ "+bean.getTotalMoney()); + return convertView; + } + + class ViewHolder{ + TextView typeTv,ratioTv,totalTv; + ImageView iv; + public ViewHolder(View view){ + typeTv = view.findViewById(R.id.item_chartfrag_tv_type); + ratioTv = view.findViewById(R.id.item_chartfrag_tv_pert); + totalTv = view.findViewById(R.id.item_chartfrag_tv_sum); + iv = view.findViewById(R.id.item_chartfrag_iv); + } + } +} diff --git a/app/src/main/java/com/example/bookkeeping1220/adapter/ChartVPAdapter.java b/app/src/main/java/com/example/bookkeeping1220/adapter/ChartVPAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..76034069c1b7ee0347ccae60300ea0b5a0294865 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/adapter/ChartVPAdapter.java @@ -0,0 +1,27 @@ +package com.example.bookkeeping1220.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class ChartVPAdapter extends FragmentPagerAdapter { + ListfragmentList; + public ChartVPAdapter(@NonNull FragmentManager fm, ListfragmentList) { + super(fm); + this.fragmentList = fragmentList; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bookkeeping1220/adapter/HeadportraitAdapter.java b/app/src/main/java/com/example/bookkeeping1220/adapter/HeadportraitAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..9846d06e9774eafb5902a4d8652093a0b35a3ddb --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/adapter/HeadportraitAdapter.java @@ -0,0 +1,72 @@ +package com.example.bookkeeping1220.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.example.bookkeeping1220.R; +import com.example.bookkeeping1220.db.AchievementBean; +import com.example.bookkeeping1220.db.HeadportraitBean; + +import java.util.List; + +public class HeadportraitAdapter extends BaseAdapter { + Context context; + ListmDatas; + LayoutInflater layoutInflater; + + public HeadportraitAdapter(Context context){ + this.context = context; + layoutInflater = LayoutInflater.from(context); + } + + public HeadportraitAdapter(Context context, List mDatas) { + this.context = context; + this.mDatas = mDatas; + layoutInflater = LayoutInflater.from(context); + } + + @Override + public int getCount() { + return mDatas.size(); + } + + @Override + public Object getItem(int i) { + return mDatas.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + class ViewHolder{ + public ImageView headIv; + public TextView headTv; + ViewHolder(View view){ + headIv = view.findViewById(R.id.item_head_gv_iv); + headTv = view.findViewById(R.id.item_head_gv_title); + } + } + @Override + public View getView(int i, View convertView, ViewGroup parent) { + HeadportraitAdapter.ViewHolder holder = null; + if (convertView == null){ + convertView = layoutInflater.inflate(R.layout.item_headportrait_gv,parent,false); + holder = new HeadportraitAdapter.ViewHolder(convertView); + convertView.setTag(holder); + }else{ + holder = (HeadportraitAdapter.ViewHolder) convertView.getTag(); + } + HeadportraitBean bean = mDatas.get(i); + holder.headTv.setText(bean.getHeadName()); + holder.headIv.setImageResource(bean.getsImageId()); + return convertView; + } +} + diff --git a/app/src/main/java/com/example/bookkeeping1220/adapter/RecordPagerAdapter.java b/app/src/main/java/com/example/bookkeeping1220/adapter/RecordPagerAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..11823dbc1a7822f9756d53f16aaaa8c6516628fc --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/adapter/RecordPagerAdapter.java @@ -0,0 +1,36 @@ +package com.example.bookkeeping1220.adapter; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class RecordPagerAdapter extends FragmentPagerAdapter { + ListfragmentList; + String[]titles = {"支出","收入"}; + public RecordPagerAdapter(@NonNull FragmentManager fm,ListfragmentList) { + super(fm); + this.fragmentList = fragmentList; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } + + @Nullable + @Override + public CharSequence getPageTitle(int position) { + return titles[position]; + } +} + diff --git a/app/src/main/java/com/example/bookkeeping1220/db/AccountBean.java b/app/src/main/java/com/example/bookkeeping1220/db/AccountBean.java new file mode 100644 index 0000000000000000000000000000000000000000..2b779457fd0e68f7e5cbd5964ad9bd52a9e69a67 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/db/AccountBean.java @@ -0,0 +1,111 @@ +package com.example.bookkeeping1220.db; + +public class AccountBean { + int id; + String typename; //类型 + int sImageId; //被选中类型图片 + String beizhu; //备注 + float money; //价格 + String time ; //保存时间字符串 + int year; + int month; + int day; + int kind; //类型 收入---1 支出---0 + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTypename() { + return typename; + } + + public void setTypename(String typename) { + this.typename = typename; + } + + public int getsImageId() { + return sImageId; + } + + public void setsImageId(int sImageId) { + this.sImageId = sImageId; + } + + public String getBeizhu() { + return beizhu; + } + + public void setBeizhu(String beizhu) { + this.beizhu = beizhu; + } + + public float getMoney() { + return money; + } + + public void setMoney(float money) { + this.money = money; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public int getYear() { + return year; + } + + public void setYear(int year) { + this.year = year; + } + + public int getMonth() { + return month; + } + + public void setMonth(int month) { + this.month = month; + } + + public int getDay() { + return day; + } + + public void setDay(int day) { + this.day = day; + } + + public int getKind() { + return kind; + } + + public void setKind(int kind) { + this.kind = kind; + } + + public AccountBean() { + } + + public AccountBean(int id, String typename, int sImageId, String beizhu, float money, String time, int year, int month, int day, int kind) { + this.id = id; + this.typename = typename; + this.sImageId = sImageId; + this.beizhu = beizhu; + this.money = money; + this.time = time; + this.year = year; + this.month = month; + this.day = day; + this.kind = kind; + } +} + diff --git a/app/src/main/java/com/example/bookkeeping1220/db/AchievementBean.java b/app/src/main/java/com/example/bookkeeping1220/db/AchievementBean.java new file mode 100644 index 0000000000000000000000000000000000000000..4d3570cf563ccdc24cb3719d8e46b2de3f408c88 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/db/AchievementBean.java @@ -0,0 +1,40 @@ +package com.example.bookkeeping1220.db; + +public class AchievementBean { + int id; + String typename;//成就类型 + int sImageId; //被选中的图片 + + public AchievementBean() { + } + + public AchievementBean(int id, String typename, int sImageId) { + this.id = id; + this.typename = typename; + this.sImageId = sImageId; + } + + public void setId(int id) { + this.id = id; + } + + public void setTypename(String typename) { + this.typename = typename; + } + + public void setsImageId(int sImageId) { + this.sImageId = sImageId; + } + + public int getId() { + return id; + } + + public String getTypename() { + return typename; + } + + public int getsImageId() { + return sImageId; + } +} diff --git a/app/src/main/java/com/example/bookkeeping1220/db/BarChartItemBean.java b/app/src/main/java/com/example/bookkeeping1220/db/BarChartItemBean.java new file mode 100644 index 0000000000000000000000000000000000000000..56d34815741a0324098d0bf74f5b8cbfbfaf6744 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/db/BarChartItemBean.java @@ -0,0 +1,51 @@ +package com.example.bookkeeping1220.db; + +/* 用于描述绘制柱状图时,每一个柱子表示的对象*/ +public class BarChartItemBean { + int year; + int month; + int day; + float summoney; + + public BarChartItemBean() { + } + + public int getYear() { + return year; + } + + public void setYear(int year) { + this.year = year; + } + + public int getMonth() { + return month; + } + + public void setMonth(int month) { + this.month = month; + } + + public int getDay() { + return day; + } + + public void setDay(int day) { + this.day = day; + } + + public float getSummoney() { + return summoney; + } + + public void setSummoney(float summoney) { + this.summoney = summoney; + } + + public BarChartItemBean(int year, int month, int day, float summoney) { + this.year = year; + this.month = month; + this.day = day; + this.summoney = summoney; + } +} diff --git a/app/src/main/java/com/example/bookkeeping1220/db/CharactersBean.java b/app/src/main/java/com/example/bookkeeping1220/db/CharactersBean.java new file mode 100644 index 0000000000000000000000000000000000000000..dc5961711a7790f2970f44b3d1f7068a3b3e0d30 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/db/CharactersBean.java @@ -0,0 +1,51 @@ +package com.example.bookkeeping1220.db; + +public class CharactersBean { + int id; + int sImageId; + String name; + int isUnlocked; + int requireScore; + + public int getId() { + return id; + } + + public int getsImageId() { + return sImageId; + } + + public String getName() { + return name; + } + + public int getIsUnlocked(){return isUnlocked;} + + public int getRequireScore(){return requireScore;} + + public void setId(int id) { + this.id = id; + } + + public void setsImageId(int sImageId) { + this.sImageId = sImageId; + } + + public void setName(String name) { + this.name = name; + } + + public void setIsUnlocked(int isUnlocked) { + this.isUnlocked = isUnlocked; + } + + public void setRequireScore(int requireScore){this.requireScore=requireScore;} + + public CharactersBean(int id, int sImageId, String name,int isUnlocked,int requireScore) { + this.id = id; + this.sImageId = sImageId; + this.name = name; + this.isUnlocked = isUnlocked; + this.requireScore=requireScore; + } +} diff --git a/app/src/main/java/com/example/bookkeeping1220/db/ChartItemBean.java b/app/src/main/java/com/example/bookkeeping1220/db/ChartItemBean.java new file mode 100644 index 0000000000000000000000000000000000000000..65039ccf89a7160da1d78eac32806cf4630fbb3d --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/db/ChartItemBean.java @@ -0,0 +1,50 @@ +package com.example.bookkeeping1220.db; + +public class ChartItemBean { + int sImageId; + String type; + float ratio; //所占比例 + float totalMoney; //此项的总钱数 + + public ChartItemBean() { + } + + public void setsImageId(int sImageId) { + this.sImageId = sImageId; + } + + public void setType(String type) { + this.type = type; + } + + public void setRatio(float ratio) { + this.ratio = ratio; + } + + public void setTotalMoney(float totalMoney) { + this.totalMoney = totalMoney; + } + + public int getsImageId() { + return sImageId; + } + + public String getType() { + return type; + } + + public float getRatio() { + return ratio; + } + + public float getTotalMoney() { + return totalMoney; + } + + public ChartItemBean(int sImageId, String type, float ratio, float totalMoney) { + this.sImageId = sImageId; + this.type = type; + this.ratio = ratio; + this.totalMoney = totalMoney; + } +} diff --git a/app/src/main/java/com/example/bookkeeping1220/db/DBManager.java b/app/src/main/java/com/example/bookkeeping1220/db/DBManager.java new file mode 100644 index 0000000000000000000000000000000000000000..f24c5e0c19a8cc1a82e149b766cbb5e732901351 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/db/DBManager.java @@ -0,0 +1,425 @@ +package com.example.bookkeeping1220.db; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.util.Log; + +import com.example.bookkeeping1220.utils.FloatUtils; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/* + * 负责管理数据库的类 + * 主要对于表当中的内容进行操作,增删改查 + * */ +public class DBManager { + + private static SQLiteDatabase db; + /* 初始化数据库对象*/ + public static void initDB(Context context){ + DBOpenHelper helper = new DBOpenHelper(context); //得到帮助类对象 + db = helper.getWritableDatabase(); //得到数据库对象 + } + + /** + * 读取数据库当中的数据,写入内存集合里 + * kind :表示收入或者支出 + * */ + public static ListgetTypeList(int kind){ + Listlist = new ArrayList<>(); + //读取typetb表当中的数据 + String sql = "select * from typetb where kind = "+kind; + Cursor cursor = db.rawQuery(sql, null); +// 循环读取游标内容,存储到对象当中 + while (cursor.moveToNext()) { + String typename = cursor.getString(cursor.getColumnIndex("typename")); + int imageId = cursor.getInt(cursor.getColumnIndex("imageId")); + int sImageId = cursor.getInt(cursor.getColumnIndex("sImageId")); + int kind1 = cursor.getInt(cursor.getColumnIndex("kind")); + int id = cursor.getInt(cursor.getColumnIndex("id")); + TypeBean typeBean = new TypeBean(id, typename, imageId, sImageId, kind); + list.add(typeBean); + } + return list; + } + + /* + * 向记账表当中插入一条元素 + * */ + public static void insertItemToAccounttb(AccountBean bean){ + ContentValues values = new ContentValues(); + values.put("typename",bean.getTypename()); + values.put("sImageId",bean.getsImageId()); + values.put("beizhu",bean.getBeizhu()); + values.put("money",bean.getMoney()); + values.put("time",bean.getTime()); + values.put("year",bean.getYear()); + values.put("month",bean.getMonth()); + values.put("day",bean.getDay()); + values.put("kind",bean.getKind()); + db.insert("accounttb",null,values); + DBManager.setScore(DBManager.getUserScore()+100); + } + /* + * 获取记账表当中某一天的所有支出或者收入情况 + * */ + public static ListgetAccountListOneDayFromAccounttb(int year,int month,int day){ + Listlist = new ArrayList<>(); + String sql = "select * from accounttb where year=? and month=? and day=? order by id desc"; + Cursor cursor = db.rawQuery(sql, new String[]{year + "", month + "", day + ""}); + //遍历符合要求的每一行数据 + while (cursor.moveToNext()) { + int id = cursor.getInt(cursor.getColumnIndex("id")); + String typename = cursor.getString(cursor.getColumnIndex("typename")); + String beizhu = cursor.getString(cursor.getColumnIndex("beizhu")); + String time = cursor.getString(cursor.getColumnIndex("time")); + int sImageId = cursor.getInt(cursor.getColumnIndex("sImageId")); + int kind = cursor.getInt(cursor.getColumnIndex("kind")); + float money = cursor.getFloat(cursor.getColumnIndex("money")); + AccountBean accountBean = new AccountBean(id, typename, sImageId, beizhu, money, time, year, month, day, kind); + list.add(accountBean); + } + return list; + } + + /* + * 获取记账表当中某一月的所有支出或者收入情况 + * */ + public static ListgetAccountListOneMonthFromAccounttb(int year,int month){ + Listlist = new ArrayList<>(); + String sql = "select * from accounttb where year=? and month=? order by id desc"; + Cursor cursor = db.rawQuery(sql, new String[]{year + "", month + ""}); + //遍历符合要求的每一行数据 + while (cursor.moveToNext()) { + int id = cursor.getInt(cursor.getColumnIndex("id")); + String typename = cursor.getString(cursor.getColumnIndex("typename")); + String beizhu = cursor.getString(cursor.getColumnIndex("beizhu")); + String time = cursor.getString(cursor.getColumnIndex("time")); + int sImageId = cursor.getInt(cursor.getColumnIndex("sImageId")); + int kind = cursor.getInt(cursor.getColumnIndex("kind")); + float money = cursor.getFloat(cursor.getColumnIndex("money")); + int day = cursor.getInt(cursor.getColumnIndex("day")); + AccountBean accountBean = new AccountBean(id, typename, sImageId, beizhu, money, time, year, month, day, kind); + list.add(accountBean); + } + return list; + } + /** + * 获取某一天的支出或者收入的总金额 kind:支出==0 收入===1 + * */ + public static float getSumMoneyOneDay(int year,int month,int day,int kind){ + float total = 0.0f; + String sql = "select sum(money) from accounttb where year=? and month=? and day=? and kind=?"; + Cursor cursor = db.rawQuery(sql, new String[]{year + "", month + "", day + "", kind + ""}); + // 遍历 + if (cursor.moveToFirst()) { + float money = cursor.getFloat(cursor.getColumnIndex("sum(money)")); + total = money; + } + return total; + } + /** + * 获取某一月的支出或者收入的总金额 kind:支出==0 收入===1 + * */ + public static float getSumMoneyOneMonth(int year,int month,int kind){ + float total = 0.0f; + String sql = "select sum(money) from accounttb where year=? and month=? and kind=?"; + Cursor cursor = db.rawQuery(sql, new String[]{year + "", month + "", kind + ""}); + // 遍历 + if (cursor.moveToFirst()) { + float money = cursor.getFloat(cursor.getColumnIndex("sum(money)")); + total = money; + } + return total; + } + /** 统计某月份支出或者收入情况有多少条 收入-1 支出-0*/ + public static int getCountItemOneMonth(int year,int month,int kind){ + int total = 0; + String sql = "select count(money) from accounttb where year=? and month=? and kind=?"; + Cursor cursor = db.rawQuery(sql, new String[]{year + "", month + "", kind + ""}); + if (cursor.moveToFirst()) { + int count = cursor.getInt(cursor.getColumnIndex("count(money)")); + total = count; + } + return total; + } + /** + * 获取某一年的支出或者收入的总金额 kind:支出==0 收入===1 + * */ + public static float getSumMoneyOneYear(int year,int kind){ + float total = 0.0f; + String sql = "select sum(money) from accounttb where year=? and kind=?"; + Cursor cursor = db.rawQuery(sql, new String[]{year + "", kind + ""}); + // 遍历 + if (cursor.moveToFirst()) { + float money = cursor.getFloat(cursor.getColumnIndex("sum(money)")); + total = money; + } + return total; + } + + /* + * 根据传入的id,删除accounttb表当中的一条数据 + * */ + public static int deleteItemFromAccounttbById(int id){ + int i = db.delete("accounttb", "id=?", new String[]{id + ""}); + return i; + } + /** + * 根据备注搜索收入或者支出的情况列表 + * */ + public static ListgetAccountListByRemarkFromAccounttb(String beizhu){ + Listlist = new ArrayList<>(); + String sql = "select * from accounttb where beizhu like '%"+beizhu+"%'"; + Cursor cursor = db.rawQuery(sql, null); + while (cursor.moveToNext()) { + int id = cursor.getInt(cursor.getColumnIndex("id")); + String typename = cursor.getString(cursor.getColumnIndex("typename")); + String bz = cursor.getString(cursor.getColumnIndex("beizhu")); + String time = cursor.getString(cursor.getColumnIndex("time")); + int sImageId = cursor.getInt(cursor.getColumnIndex("sImageId")); + int kind = cursor.getInt(cursor.getColumnIndex("kind")); + float money = cursor.getFloat(cursor.getColumnIndex("money")); + int year = cursor.getInt(cursor.getColumnIndex("year")); + int month = cursor.getInt(cursor.getColumnIndex("month")); + int day = cursor.getInt(cursor.getColumnIndex("day")); + AccountBean accountBean = new AccountBean(id, typename, sImageId, bz, money, time, year, month, day, kind); + list.add(accountBean); + } + return list; + } + + /** + * 查询记账的表当中有几个年份信息 + * */ + public static ListgetYearListFromAccounttb(){ + Listlist = new ArrayList<>(); + String sql = "select distinct(year) from accounttb order by year asc"; + Cursor cursor = db.rawQuery(sql, null); + while (cursor.moveToNext()) { + int year = cursor.getInt(cursor.getColumnIndex("year")); + list.add(year); + } + return list; + } + + /* + * 删除accounttb表格当中的所有数据 + * */ + public static void deleteAllAccount(){ + int countNum=0; + String sql = "select count(*) as total from accounttb"; + Cursor cursor = db.rawQuery(sql,null); + while(cursor.moveToNext()){ + countNum=cursor.getInt(cursor.getColumnIndex("total")); + } + sql = "delete from accounttb"; + db.execSQL(sql); + if(DBManager.getUserScore() - 100 * countNum <=0){ + DBManager.setScore(0); + }else + DBManager.setScore(DBManager.getUserScore() - 100 * countNum); + } + + /** + * 查询指定年份和月份的收入或者支出每一种类型的总钱数 + * */ + public static ListgetChartListFromAccounttb(int year,int month,int kind){ + Listlist = new ArrayList<>(); + float sumMoneyOneMonth = getSumMoneyOneMonth(year, month, kind); //求出支出或者收入总钱数 + String sql = "select typename,sImageId,sum(money)as total from accounttb where year=? and month=? and kind=? group by typename " + + "order by total desc"; + Cursor cursor = db.rawQuery(sql, new String[]{year + "", month + "", kind + ""}); + while (cursor.moveToNext()) { + int sImageId = cursor.getInt(cursor.getColumnIndex("sImageId")); + String typename = cursor.getString(cursor.getColumnIndex("typename")); + float total = cursor.getFloat(cursor.getColumnIndex("total")); + //计算所占百分比 total /sumMonth + float ratio = FloatUtils.div(total,sumMoneyOneMonth); + ChartItemBean bean = new ChartItemBean(sImageId, typename, ratio, total); + list.add(bean); + } + return list; + } + + /** + * 获取这个月当中某一天收入支出最大的金额,金额是多少 + * */ + public static float getMaxMoneyOneDayInMonth(int year,int month,int kind){ + String sql = "select sum(money) from accounttb where year=? and month=? and kind=? group by day order by sum(money) desc"; + Cursor cursor = db.rawQuery(sql, new String[]{year + "", month + "", kind + ""}); + if (cursor.moveToFirst()) { + float money = cursor.getFloat(cursor.getColumnIndex("sum(money)")); + return money; + } + return 0; + } + + /** 根据指定月份每一日收入或者支出的总钱数的集合*/ + public static ListgetSumMoneyOneDayInMonth(int year,int month,int kind){ + String sql = "select day,sum(money) from accounttb where year=? and month=? and kind=? group by day"; + Cursor cursor = db.rawQuery(sql, new String[]{year + "", month + "", kind + ""}); + Listlist = new ArrayList<>(); + while (cursor.moveToNext()) { + int day = cursor.getInt(cursor.getColumnIndex("day")); + float smoney = cursor.getFloat(cursor.getColumnIndex("sum(money)")); + BarChartItemBean itemBean = new BarChartItemBean(year, month, day, smoney); + list.add(itemBean); + } + return list; + } + + /**根据typename查找一年的账单**/ + public static float getSumMoneyOneYearInOneTypename(int year,int kind,String typename){ + String sql = "select sum(money) from accounttb where year=? and kind=? and typename=? group by day order by sum(money) desc"; + Cursor cursor = db.rawQuery(sql, new String[]{year + "", kind + "", typename + ""}); + if (cursor.moveToFirst()) { + float money = cursor.getFloat(cursor.getColumnIndex("sum(money)")); + return money; + } + return 0; + } + + public static String getUserName(){ + String sql = "create table if not exists usertb(id integer primary key autoincrement,username varchar(10))"; + db.execSQL(sql); + sql = "select * from usertb"; + Cursor cursor = db.rawQuery(sql,null); + String theName=null; + if (cursor.moveToFirst()) { + theName = cursor.getString(cursor.getColumnIndex("username")); + } + return theName; + } + + public static String getUserSign(){ + String sql = "create table if not exists signtb(id integer primary key autoincrement,usersign varchar(10))"; + db.execSQL(sql); + sql = "select * from signtb"; + Cursor cursor = db.rawQuery(sql,null); + String theName=null; + if (cursor.moveToFirst()) { + theName = cursor.getString(cursor.getColumnIndex("usersign")); + } + return theName; + } + + public static int getUserHead(){ + String sql = "create table if not exists headtb(id integer primary key autoincrement,headname varchar(10),headId integer)"; + db.execSQL(sql); + sql = "select * from headtb"; + Cursor cursor = db.rawQuery(sql,null); + String theHeadName=null; + int headId=-1; + if (cursor.moveToFirst()) { + theHeadName = cursor.getString(cursor.getColumnIndex("headname")); + headId = cursor.getInt(cursor.getColumnIndex("headId")); + } + return headId; + } + + public static int getUserScore(){ + String sql = "create table if not exists scoretb(id integer primary key autoincrement,score integer)"; + db.execSQL(sql); + sql = "select * from scoretb"; + Cursor cursor = db.rawQuery(sql,null); + String theHeadName=null; + int score=-1; + if (cursor.moveToFirst()) { + score = cursor.getInt(cursor.getColumnIndex("score")); + } + //积分为-1表示内置没有积分,通过计算获取积分:总账目数 + if(score == -1){ + score = 10000; + setScore(score); + } + return score; + } + + public static void setScore(int score) { + String sql = "delete from scoretb"; + db.execSQL(sql); + ContentValues values = new ContentValues(); + values.put("score",score); + db.insert("scoretb",null,values); + } + + public static void setName(String name){ + String sql = "delete from usertb"; + db.execSQL(sql); + ContentValues values = new ContentValues(); + values.put("username",name); + db.insert("usertb",null,values); + } + + public static void setSign(String sign){ + String sql = "delete from signtb"; + db.execSQL(sql); + ContentValues values = new ContentValues(); + values.put("usersign",sign); + db.insert("signtb",null,values); + } + + public static void setHead(int headId,String headName){ + String sql = "delete from headtb"; + db.execSQL(sql); + ContentValues values = new ContentValues(); + values.put("headname",headName); + values.put("headId",headId); + db.insert("headtb",null,values); + } + + public static ListgetVirtualCharacterFromVirtualCharactertb(){ + String sql = "create table if not exists virtualcharactertb(id integer primary key autoincrement,sImageId integer,name varchar(10),isUnlocked integer,requireScore integer)"; + db.execSQL(sql); + + Listlist = new ArrayList<>(); + sql = "select * from virtualcharactertb"; + Cursor cursor = db.rawQuery(sql,null); + //遍历符合要求的每一行数据 + while (cursor.moveToNext()) { + int id = cursor.getInt(cursor.getColumnIndex("id")); + int sImageId = cursor.getInt(cursor.getColumnIndex("sImageId")); + String name = cursor.getString(cursor.getColumnIndex("name")); + int isUnlocked = cursor.getInt(cursor.getColumnIndex("isUnlocked")); + int requireScore = cursor.getInt(cursor.getColumnIndex("requireScore")); + CharactersBean charactersBean = new CharactersBean(id,sImageId,name,isUnlocked,requireScore); + list.add(charactersBean); + } + if(list.size() == 0){ + DBOpenHelper.insertVirtualCharacter(db); + sql = "select * from virtualcharactertb"; + cursor = db.rawQuery(sql,null); + //遍历符合要求的每一行数据 + while (cursor.moveToNext()) { + int id = cursor.getInt(cursor.getColumnIndex("id")); + int sImageId = cursor.getInt(cursor.getColumnIndex("sImageId")); + String name = cursor.getString(cursor.getColumnIndex("name")); + int isUnlocked = cursor.getInt(cursor.getColumnIndex("isUnlocked")); + int requireScore = cursor.getInt(cursor.getColumnIndex("requireScore")); + CharactersBean charactersBean = new CharactersBean(id,sImageId,name,isUnlocked,requireScore); + list.add(charactersBean); + } + } + return list; + } + + public static void renewVirtualCharacterStateFromVirtualCharactertb(List charactersBeans){ + String sql = "delete from virtualcharactertb"; + db.execSQL(sql); + ContentValues values = new ContentValues(); + for(int i=0;itypeList; + TypeBaseAdapter adapter; + AccountBean accountBean; //将需要插入到记账本当中的数据保存成对象的形式 + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + accountBean = new AccountBean(); //创建对象 + accountBean.setTypename("其他"); + accountBean.setsImageId(R.mipmap.ic_qita_fs); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View view = inflater.inflate(R.layout.fragment_outcome, container, false); + initView(view); + setInitTime(); + //给GridView填充数据的方法 + loadDataToGV(); + setGVListener(); //设置GridView每一项的点击事件 + return view; + } + /* 获取当前时间,显示在timeTv上*/ + private void setInitTime() { + Date date = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm"); + String time = sdf.format(date); + timeTv.setText(time); + accountBean.setTime(time); + + Calendar calendar = Calendar.getInstance(); + int year = calendar.get(Calendar.YEAR); + int month = calendar.get(Calendar.MONTH)+1; + int day = calendar.get(Calendar.DAY_OF_MONTH); + accountBean.setYear(year); + accountBean.setMonth(month); + accountBean.setDay(day); + } + + /* 设置GridView每一项的点击事件*/ + private void setGVListener() { + typeGv.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + adapter.selectPos = position; + adapter.notifyDataSetInvalidated(); //提示绘制发生变化了 + TypeBean typeBean = typeList.get(position); + String typename = typeBean.getTypename(); + typeTv.setText(typename); + accountBean.setTypename(typename); + int simageId = typeBean.getSimageId(); + typeIv.setImageResource(simageId); + accountBean.setsImageId(simageId); + } + }); + } + + /* 给GridView填出数据的方法*/ + public void loadDataToGV() { + typeList = new ArrayList<>(); + adapter = new TypeBaseAdapter(getContext(), typeList); + typeGv.setAdapter(adapter); + } + + private void initView(View view) { + keyboardView = view.findViewById(R.id.frag_record_keyboard); + moneyEt = view.findViewById(R.id.frag_record_et_money); + typeIv = view.findViewById(R.id.frag_record_iv); + typeGv = view.findViewById(R.id.frag_record_gv); + typeTv = view.findViewById(R.id.frag_record_tv_type); + beizhuTv = view.findViewById(R.id.frag_record_tv_beizhu); + timeTv = view.findViewById(R.id.frag_record_tv_time); + beizhuTv.setOnClickListener(this); + timeTv.setOnClickListener(this); + //让自定义软键盘显示出来 + KeyBoardUtils boardUtils = new KeyBoardUtils(keyboardView, moneyEt); + boardUtils.showKeyboard(); + //设置接口,监听确定按钮按钮被点击了 + boardUtils.setOnEnsureListener(new KeyBoardUtils.OnEnsureListener() { + @Override + public void onEnsure() { + //获取输入钱数 + String moneyStr = moneyEt.getText().toString(); + if (TextUtils.isEmpty(moneyStr)||moneyStr.equals("0")) { + getActivity().finish(); + return; + } + float money = Float.parseFloat(moneyStr); + accountBean.setMoney(money); + //获取记录的信息,保存在数据库当中 + saveAccountToDB(); + // 返回上一级页面 + getActivity().finish(); + } + }); + } + /* 让子类一定要重写这个方法*/ + public abstract void saveAccountToDB(); + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.frag_record_tv_time: + showTimeDialog(); + break; + case R.id.frag_record_tv_beizhu: + showBZDialog(); + break; + } + } + /* 弹出显示时间的对话框*/ + private void showTimeDialog() { + SelectTimeDialog dialog = new SelectTimeDialog(getContext()); + dialog.show(); + //设定确定按钮被点击了的监听器 + dialog.setOnEnsureListener(new SelectTimeDialog.OnEnsureListener() { + @Override + public void onEnsure(String time, int year, int month, int day) { + timeTv.setText(time); + accountBean.setTime(time); + accountBean.setYear(year); + accountBean.setMonth(month); + accountBean.setDay(day); + } + }); + } + + /* 弹出备注对话框*/ + public void showBZDialog(){ + final BeiZhuDialog dialog = new BeiZhuDialog(getContext()); + dialog.show(); + dialog.setDialogSize(); + dialog.setOnEnsureListener(new BeiZhuDialog.OnEnsureListener() { + @Override + public void onEnsure() { + String msg = dialog.getEditText(); + if (!TextUtils.isEmpty(msg)) { + beizhuTv.setText(msg); + accountBean.setBeizhu(msg); + } + dialog.cancel(); + } + }); + } +} diff --git a/app/src/main/java/com/example/bookkeeping1220/frag_record/IncomeFragment.java b/app/src/main/java/com/example/bookkeeping1220/frag_record/IncomeFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..e1f9d123090ddbe2976292934d247c3caaab4cd0 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/frag_record/IncomeFragment.java @@ -0,0 +1,30 @@ +package com.example.bookkeeping1220.frag_record; + +import com.example.bookkeeping1220.R; +import com.example.bookkeeping1220.db.DBManager; +import com.example.bookkeeping1220.db.TypeBean; +import java.util.List; +/** + * 收入记录页面 + */ +public class IncomeFragment extends BaseRecordFragment { + + + @Override + public void loadDataToGV() { + super.loadDataToGV(); + //获取数据库当中的数据源 + List inlist = DBManager.getTypeList(1); + typeList.addAll(inlist); + adapter.notifyDataSetChanged(); + typeTv.setText("其他"); + typeIv.setImageResource(R.mipmap.in_qt_fs); + } + + @Override + public void saveAccountToDB() { + accountBean.setKind(1); + DBManager.insertItemToAccounttb(accountBean); + } +} + diff --git a/app/src/main/java/com/example/bookkeeping1220/frag_record/OutcomeFragment.java b/app/src/main/java/com/example/bookkeeping1220/frag_record/OutcomeFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..605bb26c29f0126b4c16cdc18426c99f7183cdb3 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/frag_record/OutcomeFragment.java @@ -0,0 +1,31 @@ +package com.example.bookkeeping1220.frag_record; + +import androidx.fragment.app.Fragment; +import com.example.bookkeeping1220.R; +import com.example.bookkeeping1220.db.DBManager; +import com.example.bookkeeping1220.db.TypeBean; +import java.util.List; +/** + * A simple {@link Fragment} subclass. + */ +public class OutcomeFragment extends BaseRecordFragment { + + + // 重写 + @Override + public void loadDataToGV() { + super.loadDataToGV(); + //获取数据库当中的数据源 + List outlist = DBManager.getTypeList(0); + typeList.addAll(outlist); + adapter.notifyDataSetChanged(); + typeTv.setText("其他"); + typeIv.setImageResource(R.mipmap.ic_qita_fs); + } + + @Override + public void saveAccountToDB() { + accountBean.setKind(0); + DBManager.insertItemToAccounttb(accountBean); + } +} diff --git a/app/src/main/java/com/example/bookkeeping1220/frag_record/TypeBaseAdapter.java b/app/src/main/java/com/example/bookkeeping1220/frag_record/TypeBaseAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..09bbe5ac081443b2f899fd1d0d9093b46b5c0b0b --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/frag_record/TypeBaseAdapter.java @@ -0,0 +1,56 @@ +package com.example.bookkeeping1220.frag_record; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; +import com.example.bookkeeping1220.R; +import com.example.bookkeeping1220.db.TypeBean; +import java.util.List; + +public class TypeBaseAdapter extends BaseAdapter { + Context context; + ListmDatas; + int selectPos = 0; //选中位置 + public TypeBaseAdapter(Context context, List mDatas) { + this.context = context; + this.mDatas = mDatas; + } + + @Override + public int getCount() { + return mDatas.size(); + } + + @Override + public Object getItem(int position) { + return mDatas.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + // 此适配器不考虑复用问题,因为所有的item都显示在界面上,不会因为滑动就消失,所有没有剩余的convertView,所以不用复写 + @Override + public View getView(int position, View convertView, ViewGroup parent) { + convertView = LayoutInflater.from(context).inflate(R.layout.item_recordfrag_gv,parent,false); + //查找布局当中的控件 + ImageView iv = convertView.findViewById(R.id.item_recordfrag_iv); + TextView tv = convertView.findViewById(R.id.item_recordfrag_tv); + //获取指定位置的数据源 + TypeBean typeBean = mDatas.get(position); + tv.setText(typeBean.getTypename()); +// 判断当前位置是否为选中位置,如果是选中位置,就设置为带颜色的图片,否则为灰色图片 + if (selectPos == position) { + iv.setImageResource(typeBean.getSimageId()); + }else{ + iv.setImageResource(typeBean.getImageId()); + } + return convertView; + } +} + diff --git a/app/src/main/java/com/example/bookkeeping1220/utils/BeiZhuDialog.java b/app/src/main/java/com/example/bookkeeping1220/utils/BeiZhuDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..29224a6d6f9d602fbcdc66144296e9406487a8be --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/utils/BeiZhuDialog.java @@ -0,0 +1,89 @@ +package com.example.bookkeeping1220.utils; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.view.Display; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.EditText; + +import androidx.annotation.NonNull; + +import com.example.bookkeeping1220.R; + +public class BeiZhuDialog extends Dialog implements View.OnClickListener { + EditText et; + Button cancelBtn,ensureBtn; + OnEnsureListener onEnsureListener; + // 设定回调接口的方法 + public void setOnEnsureListener(OnEnsureListener onEnsureListener) { + this.onEnsureListener = onEnsureListener; + } + + public BeiZhuDialog(@NonNull Context context) { + super(context); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_beizhu);//设置对话框显示布局 + et = findViewById(R.id.dialog_beizhu_et); + cancelBtn = findViewById(R.id.dialog_beizhu_btn_cancel); + ensureBtn = findViewById(R.id.dialog_beizhu_btn_ensure); + cancelBtn.setOnClickListener(this); + ensureBtn.setOnClickListener(this); + } + public interface OnEnsureListener{ + public void onEnsure(); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.dialog_beizhu_btn_cancel: + cancel(); + break; + case R.id.dialog_beizhu_btn_ensure: + if (onEnsureListener!=null) { + onEnsureListener.onEnsure(); + } + break; + } + } + + // 获取输入数据的方法 + public String getEditText(){ + return et.getText().toString().trim(); + } + /* 设置Dialog的尺寸和屏幕尺寸一致*/ + public void setDialogSize(){ +// 获取当前窗口对象 + Window window = getWindow(); +// 获取窗口对象的参数 + WindowManager.LayoutParams wlp = window.getAttributes(); +// 获取屏幕宽度 + Display d = window.getWindowManager().getDefaultDisplay(); + wlp.width = (int)(d.getWidth()); //对话框窗口为屏幕窗口 + wlp.gravity = Gravity.BOTTOM; + window.setBackgroundDrawableResource(android.R.color.transparent); + window.setAttributes(wlp); + handler.sendEmptyMessageDelayed(1,100); + } + + Handler handler = new Handler(){ + @Override + public void handleMessage(@NonNull Message msg) { + //自动弹出软键盘的方法 + InputMethodManager inputMethodManager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager.toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS); + } + }; +} diff --git a/app/src/main/java/com/example/bookkeeping1220/utils/BudgetDialog.java b/app/src/main/java/com/example/bookkeeping1220/utils/BudgetDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..1009da6e65f8f80250aa48a2d86c371de9f397c3 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/utils/BudgetDialog.java @@ -0,0 +1,101 @@ +package com.example.bookkeeping1220.utils; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.Display; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.Toast; + +import androidx.annotation.NonNull; + +import com.example.bookkeeping1220.R; + +public class BudgetDialog extends Dialog implements View.OnClickListener { + ImageView cancelIv; + Button ensureBtn; + EditText moneyEt; + public interface OnEnsureListener{ + public void onEnsure(float money); + } + OnEnsureListener onEnsureListener; + + public void setOnEnsureListener(OnEnsureListener onEnsureListener) { + this.onEnsureListener = onEnsureListener; + } + + public BudgetDialog(@NonNull Context context) { + super(context); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_budget); + cancelIv = findViewById(R.id.dialog_budget_iv_error); + ensureBtn = findViewById(R.id.dialog_budget_btn_ensure); + moneyEt = findViewById(R.id.dialog_budget_et); + cancelIv.setOnClickListener(this); + ensureBtn.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.dialog_budget_iv_error: + cancel(); //取消对话框 + break; + case R.id.dialog_budget_btn_ensure: + //获取输入数据数值 + String data = moneyEt.getText().toString(); + if (TextUtils.isEmpty(data)) { + Toast.makeText(getContext(),"输入数据不能为空!",Toast.LENGTH_SHORT).show(); + return; + } + float money = Float.parseFloat(data); + if (money<=0) { + Toast.makeText(getContext(),"预算金额必须大于0",Toast.LENGTH_SHORT).show(); + return; + } + if (onEnsureListener!=null) { + onEnsureListener.onEnsure(money); + } + cancel(); + break; + } + } + + /* 设置Dialog的尺寸和屏幕尺寸一致*/ + public void setDialogSize(){ +// 获取当前窗口对象 + Window window = getWindow(); +// 获取窗口对象的参数 + WindowManager.LayoutParams wlp = window.getAttributes(); +// 获取屏幕宽度 + Display d = window.getWindowManager().getDefaultDisplay(); + wlp.width = (int)(d.getWidth()); //对话框窗口为屏幕窗口 + wlp.gravity = Gravity.BOTTOM; + window.setBackgroundDrawableResource(android.R.color.transparent); + window.setAttributes(wlp); + handler.sendEmptyMessageDelayed(1,100); + } + + Handler handler = new Handler(){ + @Override + public void handleMessage(@NonNull Message msg) { + //自动弹出软键盘的方法 + InputMethodManager inputMethodManager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager.toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS); + } + }; +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bookkeeping1220/utils/CalendarDialog.java b/app/src/main/java/com/example/bookkeeping1220/utils/CalendarDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..5925c1e90334a4ffb2c5e5e4c175dc58dfa4d325 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/utils/CalendarDialog.java @@ -0,0 +1,174 @@ +package com.example.bookkeeping1220.utils; + +import android.app.Dialog; +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.view.Display; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.AdapterView; +import android.widget.GridView; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.example.bookkeeping1220.R; +import com.example.bookkeeping1220.adapter.CalendarAdapter; +import com.example.bookkeeping1220.db.DBManager; + +import androidx.annotation.NonNull; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +public class CalendarDialog extends Dialog implements View.OnClickListener { + ImageView errorIv; + GridView gv; + LinearLayout hsvLayout; + + ListhsvViewList; + ListyearList; + + int selectPos = -1; //表示正在被点击的年份的位置 + private CalendarAdapter adapter; + int selectMonth = -1; + + public interface OnRefreshListener{ + public void onRefresh(int selPos,int year,int month); + } + OnRefreshListener onRefreshListener; + + public void setOnRefreshListener(OnRefreshListener onRefreshListener) { + this.onRefreshListener = onRefreshListener; + } + + public CalendarDialog(@NonNull Context context,int selectPos,int selectMonth) { + super(context); + this.selectPos = selectPos; + this.selectMonth = selectMonth; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_calendar); + gv = findViewById(R.id.dialog_calendar_gv); + errorIv = findViewById(R.id.dialog_calendar_iv); + hsvLayout = findViewById(R.id.dialog_calendar_layout); + errorIv.setOnClickListener(this); + // 向横向的ScrollView当中添加View的方法 + addViewToLayout(); + initGridView(); + //设置GridView当中每一个item的点击事件 + setGVListener(); + } + + private void setGVListener() { + gv.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + adapter.selPos = position; + adapter.notifyDataSetInvalidated(); + int month = position + 1; + int year = adapter.year; + // 获取到被选中的年份和月份 + onRefreshListener.onRefresh(selectPos,year,month); + cancel(); + } + }); + } + + private void initGridView() { + int selYear = yearList.get(selectPos); + adapter = new CalendarAdapter(getContext(), selYear); + if (selectMonth == -1) { + int month = Calendar.getInstance().get(Calendar.MONTH); + adapter.selPos = month; + }else { + adapter.selPos = selectMonth-1; + } + gv.setAdapter(adapter); + } + + private void addViewToLayout() { + hsvViewList = new ArrayList<>(); //将添加进入线性布局当中的TextView进行统一管理的集合 + yearList = DBManager.getYearListFromAccounttb(); //获取数据库当中存储了多少个年份 + //如果数据库当中没有记录,就添加今年的记录 + if (yearList.size() == 0) { + int year = Calendar.getInstance().get(Calendar.YEAR); + yearList.add(year); + } + + //遍历年份,有几年,就向ScrollView当中添加几个view + for (int i = 0; i < yearList.size(); i++) { + int year = yearList.get(i); + View view = getLayoutInflater().inflate(R.layout.item_dialogcal_hsv, null); + hsvLayout.addView(view); //将view添加到布局当中 + TextView hsvTv = view.findViewById(R.id.item_dialogcal_hsv_tv); + hsvTv.setText(year+""); + hsvViewList.add(hsvTv); + } + if (selectPos == -1) { + selectPos = hsvViewList.size()-1; //设置当前被选中的是最近的年份 + } + changeTvbg(selectPos); //将最后一个设置为选中状态 + setHSVClickListener(); //设置每一个View的监听事件 + } + /** 给横向的ScrollView当中每一个TextView设置点击事件*/ + private void setHSVClickListener() { + for (int i = 0; i < hsvViewList.size(); i++) { + TextView view = hsvViewList.get(i); + final int pos = i; + view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + changeTvbg(pos); + selectPos = pos; + // 获取被选中的年份,然后下面的GridView显示数据源会发生变化 + int year = yearList.get(selectPos); + adapter.setYear(year); + } + }); + } + } + + /** 传入被选中的位置,改变此位置上的背景和文字颜色*/ + private void changeTvbg(int selectPos) { + for (int i = 0; i < hsvViewList.size(); i++) { + TextView tv = hsvViewList.get(i); + tv.setBackgroundResource(R.drawable.dialog_btn_bg); + tv.setTextColor(Color.BLACK); + } + + TextView selView = hsvViewList.get(selectPos); + selView.setBackgroundResource(R.drawable.main_recordbtn_bg); + selView.setTextColor(Color.WHITE); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.dialog_calendar_iv: + cancel(); + break; + } + } + + /* 设置Dialog的尺寸和屏幕尺寸一致*/ + public void setDialogSize(){ +// 获取当前窗口对象 + Window window = getWindow(); +// 获取窗口对象的参数 + WindowManager.LayoutParams wlp = window.getAttributes(); +// 获取屏幕宽度 + Display d = window.getWindowManager().getDefaultDisplay(); + wlp.width = (int)(d.getWidth()); //对话框窗口为屏幕窗口 + wlp.gravity = Gravity.TOP; + window.setBackgroundDrawableResource(android.R.color.transparent); + window.setAttributes(wlp); + } +} diff --git a/app/src/main/java/com/example/bookkeeping1220/utils/FloatUtils.java b/app/src/main/java/com/example/bookkeeping1220/utils/FloatUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..bf952e2324e4a5e770bdd817efec96a8b7268ae1 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/utils/FloatUtils.java @@ -0,0 +1,23 @@ +package com.example.bookkeeping1220.utils; + +import java.math.BigDecimal; + +public class FloatUtils { + + /* 进行除法运算,保留4位小数*/ + public static float div(float v1,float v2){ + float v3 = v1/v2; + BigDecimal b1 = new BigDecimal(v3); + float val = b1.setScale(4, 4).floatValue(); + return val; + } + + // 将浮点数类型,转换成百分比显示形式 + public static String ratioToPercent(float val){ + float v = val*100; + BigDecimal b1 = new BigDecimal(v); + float v1 = b1.setScale(2, 4).floatValue(); + String per = v1+"%"; + return per; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bookkeeping1220/utils/KeyBoardUtils.java b/app/src/main/java/com/example/bookkeeping1220/utils/KeyBoardUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..dae3c38501432dd8131910f48a95225b445244a4 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/utils/KeyBoardUtils.java @@ -0,0 +1,102 @@ +package com.example.bookkeeping1220.utils; + +import android.inputmethodservice.Keyboard; +import android.inputmethodservice.KeyboardView; +import android.text.Editable; +import android.text.InputType; +import android.view.View; +import android.widget.EditText; + +import com.example.bookkeeping1220.R; + +public class KeyBoardUtils { + private final Keyboard k1; //自定义键盘 + private KeyboardView keyboardView; + private EditText editText; + + public interface OnEnsureListener{ + public void onEnsure(); + } + OnEnsureListener onEnsureListener; + + public void setOnEnsureListener(OnEnsureListener onEnsureListener) { + this.onEnsureListener = onEnsureListener; + } + + public KeyBoardUtils(KeyboardView keyboardView, EditText editText) { + this.keyboardView = keyboardView; + this.editText = editText; + this.editText.setInputType(InputType.TYPE_NULL); //取消弹出系统键盘 + k1 = new Keyboard(this.editText.getContext(), R.xml.key); + + this.keyboardView.setKeyboard(k1); //设置要显示键盘的样式 + this.keyboardView.setEnabled(true); + this.keyboardView.setPreviewEnabled(false); + this.keyboardView.setOnKeyboardActionListener(listener); //设置键盘按钮被点击了的监听 + } + + KeyboardView.OnKeyboardActionListener listener = new KeyboardView.OnKeyboardActionListener() { + @Override + public void onPress(int primaryCode) { + } + @Override + public void onRelease(int primaryCode) { + } + @Override + public void onKey(int primaryCode, int[] keyCodes) { + Editable editable = editText.getText(); + int start = editText.getSelectionStart(); + switch (primaryCode) { + case Keyboard.KEYCODE_DELETE: //点击了删除键 + if (editable!=null &&editable.length()>0) { + if (start>0) { + editable.delete(start-1,start); + } + } + break; + case Keyboard.KEYCODE_CANCEL: //点击了清零 + editable.clear(); + break; + case Keyboard.KEYCODE_DONE: //点击了完成 + onEnsureListener.onEnsure(); //通过接口回调的方法,当点击确定时,可以调用这个方法 + break; + default: //其他数字直接插入 + editable.insert(start,Character.toString((char)primaryCode)); + break; + } + } + @Override + public void onText(CharSequence text) { + } + @Override + public void swipeLeft() { + } + @Override + public void swipeRight() { + } + @Override + public void swipeDown() { + } + @Override + public void swipeUp() { + } + }; + + // 显示键盘 + public void showKeyboard(){ + int visibility = keyboardView.getVisibility(); + if (visibility == View.INVISIBLE ||visibility==View.GONE) { + keyboardView.setVisibility(View.VISIBLE); + } + } + + // 隐藏键盘 + public void hideKeyboard(){ + int visibility = keyboardView.getVisibility(); + if (visibility== View.VISIBLE||visibility==View.INVISIBLE) { + keyboardView.setVisibility(View.GONE); + } + } +} + + diff --git a/app/src/main/java/com/example/bookkeeping1220/utils/MoreDialog.java b/app/src/main/java/com/example/bookkeeping1220/utils/MoreDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..3e34866814b768f09c5ceea8b2c22d906d84823c --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/utils/MoreDialog.java @@ -0,0 +1,78 @@ +package com.example.bookkeeping1220.utils; + +import android.app.Dialog; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.view.Display; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.ImageView; +import androidx.annotation.NonNull; +import com.example.bookkeeping1220.AboutActivity; +import com.example.bookkeeping1220.HistoryActivity; +import com.example.bookkeeping1220.R; +import com.example.bookkeeping1220.SettingActivity; + +public class MoreDialog extends Dialog implements View.OnClickListener { + Button aboutBtn,settingBtn,historyBtn,infoBtn; + ImageView errorIv; + public MoreDialog(@NonNull Context context) { + super(context); + } + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_more); + aboutBtn = findViewById(R.id.dialog_more_btn_about); + settingBtn = findViewById(R.id.dialog_more_btn_setting); + historyBtn = findViewById(R.id.dialog_more_btn_record); + infoBtn = findViewById(R.id.dialog_more_btn_info); + errorIv = findViewById(R.id.dialog_more_iv); + + aboutBtn.setOnClickListener(this); + settingBtn.setOnClickListener(this); + historyBtn.setOnClickListener(this); + infoBtn.setOnClickListener(this); + errorIv.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + Intent intent = new Intent(); + switch (v.getId()) { + case R.id.dialog_more_btn_about: + intent.setClass(getContext(), AboutActivity.class); + getContext().startActivity(intent); + break; + case R.id.dialog_more_btn_setting: + intent.setClass(getContext(), SettingActivity.class); + getContext().startActivity(intent); + break; + case R.id.dialog_more_btn_record: + intent.setClass(getContext(), HistoryActivity.class); + getContext().startActivity(intent); + break; + case R.id.dialog_more_iv: + break; + } + cancel(); + } + + /* 设置Dialog的尺寸和屏幕尺寸一致*/ + public void setDialogSize(){ +// 获取当前窗口对象 + Window window = getWindow(); +// 获取窗口对象的参数 + WindowManager.LayoutParams wlp = window.getAttributes(); +// 获取屏幕宽度 + Display d = window.getWindowManager().getDefaultDisplay(); + wlp.width = (int)(d.getWidth()); //对话框窗口为屏幕窗口 + wlp.gravity = Gravity.BOTTOM; + window.setBackgroundDrawableResource(android.R.color.transparent); + window.setAttributes(wlp); + } +} diff --git a/app/src/main/java/com/example/bookkeeping1220/utils/NameDialog.java b/app/src/main/java/com/example/bookkeeping1220/utils/NameDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..92d61ab259f102ee23ff32ef2faccc525ed6fe66 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/utils/NameDialog.java @@ -0,0 +1,101 @@ +package com.example.bookkeeping1220.utils; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.Display; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.Toast; + +import androidx.annotation.NonNull; + +import com.example.bookkeeping1220.R; + +public class NameDialog extends Dialog implements View.OnClickListener{ + EditText et; + Button cancelBtn,ensureBtn; + NameDialog.OnEnsureListener onEnsureListener; + public interface OnEnsureListener{ + public void onEnsure(String name); + } + + public void setOnEnsureListener(NameDialog.OnEnsureListener onEnsureListener) { + this.onEnsureListener = onEnsureListener; + } + + public NameDialog(@NonNull Context context) { + super(context); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_name);//设置对话框显示布局 + et = findViewById(R.id.dialog_name_et); + cancelBtn = findViewById(R.id.dialog_name_btn_cancel); + ensureBtn = findViewById(R.id.dialog_name_btn_ensure); + cancelBtn.setOnClickListener(this); + ensureBtn.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.dialog_name_btn_cancel: + cancel(); //取消对话框 + break; + case R.id.dialog_name_btn_ensure: + //获取输入数据数值 + String data = et.getText().toString(); + if (TextUtils.isEmpty(data)) { + Toast.makeText(getContext(),"输入数据不能为空!",Toast.LENGTH_SHORT).show(); + return; + } + if (data.length()>10) { + Toast.makeText(getContext(),"长度过长",Toast.LENGTH_SHORT).show(); + return; + } + if (onEnsureListener!=null) { + onEnsureListener.onEnsure(data); + } + cancel(); + break; + } + } + + + /* 设置Dialog的尺寸和屏幕尺寸一致*/ + public void setDialogSize(){ +// 获取当前窗口对象 + Window window = getWindow(); +// 获取窗口对象的参数 + WindowManager.LayoutParams wlp = window.getAttributes(); +// 获取屏幕宽度 + Display d = window.getWindowManager().getDefaultDisplay(); + wlp.width = (int)(d.getWidth()); //对话框窗口为屏幕窗口 + wlp.gravity = Gravity.BOTTOM; + window.setBackgroundDrawableResource(android.R.color.transparent); + window.setAttributes(wlp); + handler.sendEmptyMessageDelayed(1,100); + } + + + Handler handler = new Handler(){ + @Override + public void handleMessage(@NonNull Message msg) { + //自动弹出软键盘的方法 + InputMethodManager inputMethodManager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager.toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS); + } + }; +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bookkeeping1220/utils/SelectTimeDialog.java b/app/src/main/java/com/example/bookkeeping1220/utils/SelectTimeDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..bc4646b8f05eb76da20c8a1883ce8973c11f29c0 --- /dev/null +++ b/app/src/main/java/com/example/bookkeeping1220/utils/SelectTimeDialog.java @@ -0,0 +1,136 @@ +package com.example.bookkeeping1220.utils; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.DatePicker; +import android.widget.EditText; + +import androidx.annotation.NonNull; + +import com.example.bookkeeping1220.R; + +/* + * 在记录页面弹出时间对话框 + * */ +public class SelectTimeDialog extends Dialog implements View.OnClickListener { + EditText hourEt,minuteEt; + DatePicker datePicker; + Button ensureBtn,cancelBtn; + public interface OnEnsureListener{ + public void onEnsure(String time,int year,int month,int day); + } + OnEnsureListener onEnsureListener; + + public void setOnEnsureListener(OnEnsureListener onEnsureListener) { + this.onEnsureListener = onEnsureListener; + } + + public SelectTimeDialog(@NonNull Context context) { + super(context); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_time); + hourEt = findViewById(R.id.dialog_time_et_hour); + minuteEt = findViewById(R.id.dialog_time_et_minute); + datePicker = findViewById(R.id.dialog_time_dp); + ensureBtn = findViewById(R.id.dialog_time_btn_ensure); + cancelBtn = findViewById(R.id.dialog_time_btn_cancel); + ensureBtn.setOnClickListener(this); //添加点击监听事件 + cancelBtn.setOnClickListener(this); + hideDatePickerHeader(); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.dialog_time_btn_cancel: + cancel(); + break; + case R.id.dialog_time_btn_ensure: + int year = datePicker.getYear(); //选择年份 + int month = datePicker.getMonth()+1; + int dayOfMonth = datePicker.getDayOfMonth(); + String monthStr = String.valueOf(month); + if (month<10){ + monthStr = "0"+month; + } + String dayStr = String.valueOf(dayOfMonth); + if (dayOfMonth<10){ + dayStr="0"+dayOfMonth; + } +// 获取输入的小时和分钟 + String hourStr = hourEt.getText().toString(); + String minuteStr = minuteEt.getText().toString(); + int hour = 0; + if (!TextUtils.isEmpty(hourStr)) { + hour = Integer.parseInt(hourStr); + hour=hour%24; + } + int minute = 0; + if (!TextUtils.isEmpty(minuteStr)) { + minute = Integer.parseInt(minuteStr); + minute=minute%60; + } + + hourStr=String.valueOf(hour); + minuteStr=String.valueOf(minute); + if (hour<10){ + hourStr="0"+hour; + } + if (minute<10){ + minuteStr="0"+minute; + } + String timeFormat = year+"年"+monthStr+"月"+dayStr+"日 "+hourStr+":"+minuteStr; + if (onEnsureListener!=null) { + onEnsureListener.onEnsure(timeFormat,year,month,dayOfMonth); + } + cancel(); + break; + } + } + + //隐藏DatePicker头布局 + private void hideDatePickerHeader(){ + ViewGroup rootView = (ViewGroup) datePicker.getChildAt(0); + if (rootView == null) { + return; + } + View headerView = rootView.getChildAt(0); + if (headerView == null) { + return; + } + //5.0+ + int headerId = getContext().getResources().getIdentifier("day_picker_selector_layout", "id", "android"); + if (headerId == headerView.getId()) { + headerView.setVisibility(View.GONE); + ViewGroup.LayoutParams layoutParamsRoot = rootView.getLayoutParams(); + layoutParamsRoot.width = ViewGroup.LayoutParams.WRAP_CONTENT; + rootView.setLayoutParams(layoutParamsRoot); + + ViewGroup animator = (ViewGroup) rootView.getChildAt(1); + ViewGroup.LayoutParams layoutParamsAnimator = animator.getLayoutParams(); + layoutParamsAnimator.width = ViewGroup.LayoutParams.WRAP_CONTENT; + animator.setLayoutParams(layoutParamsAnimator); + + View child = animator.getChildAt(0); + ViewGroup.LayoutParams layoutParamsChild = child.getLayoutParams(); + layoutParamsChild.width = ViewGroup.LayoutParams.WRAP_CONTENT; + child.setLayoutParams(layoutParamsChild); + return; + } + + // 6.0+ + headerId = getContext().getResources().getIdentifier("date_picker_header","id","android"); + if (headerId == headerView.getId()) { + headerView.setVisibility(View.GONE); + } + } +} diff --git a/app/src/main/res/drawable-v24/ic_arrowback.xml b/app/src/main/res/drawable-v24/ic_arrowback.xml new file mode 100644 index 0000000000000000000000000000000000000000..bab545a707413a6f4ec300bf2f756698b2f0e2f7 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_arrowback.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000000000000000000000000000000000000..2b068d11462a4b96669193de13a711a3a36220a0 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cup.png b/app/src/main/res/drawable/cup.png new file mode 100644 index 0000000000000000000000000000000000000000..e88fe35a3016ff53274b4a7981efda81de3098f7 Binary files /dev/null and b/app/src/main/res/drawable/cup.png differ diff --git a/app/src/main/res/drawable/cup1.png b/app/src/main/res/drawable/cup1.png new file mode 100644 index 0000000000000000000000000000000000000000..87fe362f0cd1ebe0966f4f5640c3030409f17ac8 Binary files /dev/null and b/app/src/main/res/drawable/cup1.png differ diff --git a/app/src/main/res/drawable/cup1_fs.png b/app/src/main/res/drawable/cup1_fs.png new file mode 100644 index 0000000000000000000000000000000000000000..9219ee974c665ee23df50581706c882b2762c0be Binary files /dev/null and b/app/src/main/res/drawable/cup1_fs.png differ diff --git a/app/src/main/res/drawable/cup2.png b/app/src/main/res/drawable/cup2.png new file mode 100644 index 0000000000000000000000000000000000000000..bb40e087933ea21f1e8940521b9c90f1e02c3fe2 Binary files /dev/null and b/app/src/main/res/drawable/cup2.png differ diff --git a/app/src/main/res/drawable/cup3.png b/app/src/main/res/drawable/cup3.png new file mode 100644 index 0000000000000000000000000000000000000000..1c90370b2fd272a68944a98c90a36e28fde70203 Binary files /dev/null and b/app/src/main/res/drawable/cup3.png differ diff --git a/app/src/main/res/drawable/cup_fs.png b/app/src/main/res/drawable/cup_fs.png new file mode 100644 index 0000000000000000000000000000000000000000..fb090ee66640e71b2122d201d957d523777d010a Binary files /dev/null and b/app/src/main/res/drawable/cup_fs.png differ diff --git a/app/src/main/res/drawable/daluobo.png b/app/src/main/res/drawable/daluobo.png new file mode 100644 index 0000000000000000000000000000000000000000..62dae8d15a5a8d8ebea3e23d7e446d0710381290 Binary files /dev/null and b/app/src/main/res/drawable/daluobo.png differ diff --git a/app/src/main/res/drawable/dialog_btn_bg.xml b/app/src/main/res/drawable/dialog_btn_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..dda52812f845c32a84eb57b2e3221bd42ef686a1 --- /dev/null +++ b/app/src/main/res/drawable/dialog_btn_bg.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/duola.png b/app/src/main/res/drawable/duola.png new file mode 100644 index 0000000000000000000000000000000000000000..4381c05e1dd99d74e9c837c98538ad3c4af6610c Binary files /dev/null and b/app/src/main/res/drawable/duola.png differ diff --git a/app/src/main/res/drawable/head_portrait.png b/app/src/main/res/drawable/head_portrait.png new file mode 100644 index 0000000000000000000000000000000000000000..bf0e2e68b442c6253d4b8c967940baefa24a30db Binary files /dev/null and b/app/src/main/res/drawable/head_portrait.png differ diff --git a/app/src/main/res/drawable/ic_bill.xml b/app/src/main/res/drawable/ic_bill.xml new file mode 100644 index 0000000000000000000000000000000000000000..7feeb3dbeccb0412326e45ef171c2b358207f5cc --- /dev/null +++ b/app/src/main/res/drawable/ic_bill.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_chat.xml b/app/src/main/res/drawable/ic_chat.xml new file mode 100644 index 0000000000000000000000000000000000000000..26208ade1e337b22905a82357ac7ec9fcaf144de --- /dev/null +++ b/app/src/main/res/drawable/ic_chat.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000000000000000000000000000000000000..07d5da9cbf141911847041df5d7b87f0dd5ef9d4 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_person.xml b/app/src/main/res/drawable/ic_person.xml new file mode 100644 index 0000000000000000000000000000000000000000..6bdced2dc90b812ec0cd288e0b6ca329e7524216 --- /dev/null +++ b/app/src/main/res/drawable/ic_person.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/labi.png b/app/src/main/res/drawable/labi.png new file mode 100644 index 0000000000000000000000000000000000000000..c34245f5a5d7c50e0dd87ebe261eaf0bbf1ac784 Binary files /dev/null and b/app/src/main/res/drawable/labi.png differ diff --git a/app/src/main/res/drawable/main_morebtn_bg.xml b/app/src/main/res/drawable/main_morebtn_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..76062df59a368c13a2511557b7fc1cd815d5b7b9 --- /dev/null +++ b/app/src/main/res/drawable/main_morebtn_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/main_recordbtn_bg.xml b/app/src/main/res/drawable/main_recordbtn_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..aaf7e3bb5d085d99a144d5ef3b5ea78a7c381d08 --- /dev/null +++ b/app/src/main/res/drawable/main_recordbtn_bg.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/portrait_1.jpeg b/app/src/main/res/drawable/portrait_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..33980af309263455c664fb66ea71ba66142c6484 Binary files /dev/null and b/app/src/main/res/drawable/portrait_1.jpeg differ diff --git a/app/src/main/res/drawable/portrait_10.jpeg b/app/src/main/res/drawable/portrait_10.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c9723cadd7e34ed7f96e9fdc9a9eaba7f37a79f1 Binary files /dev/null and b/app/src/main/res/drawable/portrait_10.jpeg differ diff --git a/app/src/main/res/drawable/portrait_11.jpg b/app/src/main/res/drawable/portrait_11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..166de67105e3a79fee203dbc890cc7ac42f2882f Binary files /dev/null and b/app/src/main/res/drawable/portrait_11.jpg differ diff --git a/app/src/main/res/drawable/portrait_2.jpeg b/app/src/main/res/drawable/portrait_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..cbc4051e7d56b8453d21cb7534f8780c37dc6e67 Binary files /dev/null and b/app/src/main/res/drawable/portrait_2.jpeg differ diff --git a/app/src/main/res/drawable/portrait_3.jpeg b/app/src/main/res/drawable/portrait_3.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..5934f6679d5b99998f0d055e8a6ec0d3744cdbc9 Binary files /dev/null and b/app/src/main/res/drawable/portrait_3.jpeg differ diff --git a/app/src/main/res/drawable/portrait_4.jpeg b/app/src/main/res/drawable/portrait_4.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..94cafedc335f9a13b27128da97ca02174896a12e Binary files /dev/null and b/app/src/main/res/drawable/portrait_4.jpeg differ diff --git a/app/src/main/res/drawable/portrait_5.jpeg b/app/src/main/res/drawable/portrait_5.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..bdffde0bff0b07ab553d014c354276ce05b44e83 Binary files /dev/null and b/app/src/main/res/drawable/portrait_5.jpeg differ diff --git a/app/src/main/res/drawable/portrait_6.jpeg b/app/src/main/res/drawable/portrait_6.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4ca063667c0de34a9f5bcbf482f3fb18202a646d Binary files /dev/null and b/app/src/main/res/drawable/portrait_6.jpeg differ diff --git a/app/src/main/res/drawable/portrait_7.jpeg b/app/src/main/res/drawable/portrait_7.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..afae2e5f2965a98311a14c79875faa2a25825763 Binary files /dev/null and b/app/src/main/res/drawable/portrait_7.jpeg differ diff --git a/app/src/main/res/drawable/portrait_8.jpeg b/app/src/main/res/drawable/portrait_8.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..3daca09ed6b25de0569cc4d30ea12a7e9d58143c Binary files /dev/null and b/app/src/main/res/drawable/portrait_8.jpeg differ diff --git a/app/src/main/res/drawable/portrait_9.jpeg b/app/src/main/res/drawable/portrait_9.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..111eb4b11709593d8fcdbecc1b0c3f94f79bcfcc Binary files /dev/null and b/app/src/main/res/drawable/portrait_9.jpeg differ diff --git a/app/src/main/res/drawable/selector.xml b/app/src/main/res/drawable/selector.xml new file mode 100644 index 0000000000000000000000000000000000000000..08972eda9ee396cea3efc08690a7be63e9a5bdeb --- /dev/null +++ b/app/src/main/res/drawable/selector.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml new file mode 100644 index 0000000000000000000000000000000000000000..a54ccb5a4249c84c9e766b67d3884d6578f29e5f --- /dev/null +++ b/app/src/main/res/layout/activity_about.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_achievement.xml b/app/src/main/res/layout/activity_achievement.xml new file mode 100644 index 0000000000000000000000000000000000000000..623fdd46b67905b38bc1ece3ee0d67f43f504bc9 --- /dev/null +++ b/app/src/main/res/layout/activity_achievement.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_characters.xml b/app/src/main/res/layout/activity_characters.xml new file mode 100644 index 0000000000000000000000000000000000000000..dfa9e001ada24b8ffdb207d9003ab116a2cb724e --- /dev/null +++ b/app/src/main/res/layout/activity_characters.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_headportrait.xml b/app/src/main/res/layout/activity_headportrait.xml new file mode 100644 index 0000000000000000000000000000000000000000..9b946c71cf304b49f78821207bbe6d4d5b718ac3 --- /dev/null +++ b/app/src/main/res/layout/activity_headportrait.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_history.xml b/app/src/main/res/layout/activity_history.xml new file mode 100644 index 0000000000000000000000000000000000000000..adbbc57307de63103d82807d4df23377cffd7a57 --- /dev/null +++ b/app/src/main/res/layout/activity_history.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_individual.xml b/app/src/main/res/layout/activity_individual.xml new file mode 100644 index 0000000000000000000000000000000000000000..c9ec98d99edf0c3c9b9b1deaaa7f49ad6e8dbc8b --- /dev/null +++ b/app/src/main/res/layout/activity_individual.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_beizhu.xml b/app/src/main/res/layout/dialog_beizhu.xml new file mode 100644 index 0000000000000000000000000000000000000000..5a287bf543bf35502f44f4489ac2d0477aca5ecd --- /dev/null +++ b/app/src/main/res/layout/dialog_beizhu.xml @@ -0,0 +1,52 @@ + + + + + + + +