Android开发-记账本APP

软件界面:

 

 

 工程目录:

 

 源码:

MainActivity.java

package com.example.money;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

import com.google.android.material.bottomnavigation.BottomNavigationView;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;


public class MainActivity extends AppCompatActivity {

    DBHelper dbHelper=null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        BottomNavigationView navView = findViewById(R.id.nav_view);
        AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(R.id.navigation_home, R.id.navigation_dashboard).build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
        NavigationUI.setupWithNavController(navView, navController);

        dbHelper=new DBHelper(getApplicationContext());
        //show();
    }
    public void clear(){
        EditText in_time = findViewById(R.id.in_time);
        EditText in_num = findViewById(R.id.in_num);
        EditText in_type = findViewById(R.id.in_type);
        RadioGroup b = findViewById(R.id.radioGroup);
        String bb = ((RadioButton)findViewById(b.getCheckedRadioButtonId())).getText().toString();
        in_time.setText("");
        in_num.setText("");
        in_type.setText("");
        b.clearCheck();
    }
    public void insql(){
        EditText in_time = (EditText)findViewById(R.id.in_time);
        EditText in_num = (EditText)findViewById(R.id.in_num);
        EditText in_type = (EditText)findViewById(R.id.in_type);
        RadioGroup b = findViewById(R.id.radioGroup);

        String bb = ((RadioButton)findViewById(b.getCheckedRadioButtonId())).getText().toString();
        String time=in_time.getText().toString();
        String num="";
        if(bb.equals("支出")){
            num = "-" + in_num.getText().toString();
        }
        else {
            num = "+" + in_num.getText().toString();
        }
        String type=in_type.getText().toString();

        ContentValues contentValues = new ContentValues();
        contentValues.put("time",time);
        contentValues.put("num",num);
        contentValues.put("type",type);

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.insert("moneytab",null,contentValues);

    }
    public void submit(View v){
        insql();
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        //Log.i("点击按钮","记录");
        builder.setMessage("已记录");
        builder.setPositiveButton("确认", null);
        builder.create().show();
        clear();
    }

    public void show(View view){
        TextView lv = findViewById(R.id.lv);
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor cursor = db.rawQuery("select * from moneytab",null);
        String str="";
        while(cursor.moveToNext()){
            String time = cursor.getString(cursor.getColumnIndex("time"));
            String num = cursor.getString(cursor.getColumnIndex("num"));
            String type = cursor.getString(cursor.getColumnIndex("type"));
            str += time+"   \t"+ num +"   \t"+ type + "\n";
        }
        if(str == ""){
            lv.setText("暂无数据");
        }
        else{
            lv.setText(str);
        }

    }

}

DBHelper.java

package com.example.money;

import android.content.Context;
import android.database.sqlite.*;

public class DBHelper extends SQLiteOpenHelper {

    public DBHelper(Context context){
        super(context,"money.db",null,3);
    }
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL("create table moneytab(time text,num text,type text)");
    }
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase,int oldVersion,int newVersion) {

    }
    @Override
    public void onOpen(SQLiteDatabase sqLiteDatabase){
        super.onOpen(sqLiteDatabase);
    }

}

dashboard

package com.example.money.ui.dashboard;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;

import com.example.money.R;

public class DashboardFragment extends Fragment {

    private DashboardViewModel dashboardViewModel;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        dashboardViewModel =
                ViewModelProviders.of(this).get(DashboardViewModel.class);
        View root = inflater.inflate(R.layout.fragment_dashboard, container, false);

        return root;
    }



}
package com.example.money.ui.dashboard;

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class DashboardViewModel extends ViewModel {

    private MutableLiveData<String> mText;

    public DashboardViewModel() {
        mText = new MutableLiveData<>();
        //mText.setValue("收入界面");
    }

    public LiveData<String> getText() {
        return mText;
    }
}

home

package com.example.money.ui.home;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;

import com.example.money.R;

public class HomeFragment extends Fragment {

    private HomeViewModel homeViewModel;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        homeViewModel =
                ViewModelProviders.of(this).get(HomeViewModel.class);
        View root = inflater.inflate(R.layout.fragment_home, container, false);

        return root;
    }
}
package com.example.money.ui.home;

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class HomeViewModel extends ViewModel {

    private MutableLiveData<String> mText;

    public HomeViewModel() {
        mText = new MutableLiveData<>();
        //mText.setValue("账本界面");
    }

    public LiveData<String> getText() {
        return mText;
    }
}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="?attr/actionBarSize">

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/nav_view"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="0dp"
        android:layout_marginEnd="0dp"
        android:background="?android:attr/windowBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/bottom_nav_menu" />

    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toTopOf="@id/nav_view"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/mobile_navigation" />

</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/in_time"
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:layout_marginTop="75dp"
        android:hint="时间"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.502"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <EditText
        android:id="@+id/in_num"
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:layout_marginTop="24dp"
        android:hint="金额"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.497"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/radioGroup" />

    <EditText
        android:id="@+id/in_type"
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:layout_marginTop="32dp"
        android:hint="描述"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.502"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/in_num" />

    <Button
        android:id="@+id/in_submit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="记录"
        android:onClick="submit"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/in_type" />

    <RadioGroup
        android:id="@+id/radioGroup"
        android:layout_width="200dp"
        android:layout_height="65dp"
        android:layout_marginTop="24dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/in_time">

        <RadioButton
            android:id="@+id/in"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="收入" />

        <RadioButton
            android:id="@+id/out"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="支出" />
    </RadioGroup>


</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/lv"
        android:layout_width="360dp"
        android:layout_height="0dp"
        android:layout_marginBottom="35dp"
        android:textSize="20sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="show"
        android:text="浏览账本"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

底侧栏

 

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/navigation_home"
        android:icon="@drawable/ic_home_black_24dp"
        android:title="@string/title_home" />

    <item
        android:id="@+id/navigation_dashboard"
        android:icon="@android:drawable/ic_menu_add"
        android:title="@string/title_dashboard" />


</menu>

values\strings.xml

<resources>
    <string name="app_name">记账本</string>
    <string name="title_home">浏览</string>
    <string name="title_dashboard">记账</string>
</resources>

 

 

遇到的问题:

1.账本界面的信息无法直接展示,必须点击按钮再展示。

2.从数据库读取的信息展示问题,目前是用String字符串记录读取的数据,再用TextView.setText()将TextView框的文字设为String。

3.目前未实现查询、删除操作。

posted @ 2021-03-02 22:33  学习中_1  阅读(519)  评论(0编辑  收藏  举报