Android家庭记账本开发第三天:MainActivity主界面逻辑文件

昨天讲了主界面的xml文件的布局,这里讲一下对应的主界面的Java文件,首先上代码:

  1 package com.example.myapplication3;
  2 
  3 import android.annotation.SuppressLint;
  4 import android.content.Intent;
  5 import android.database.Cursor;
  6 import android.database.sqlite.SQLiteDatabase;
  7 import android.os.Bundle;
  8 import android.util.Log;
  9 import android.view.View;
 10 import android.widget.ImageButton;
 11 import android.widget.ListView;
 12 
 13 import androidx.annotation.Nullable;
 14 import androidx.appcompat.app.AppCompatActivity;
 15 
 16 import java.util.ArrayList;
 17 import java.util.List;
 18 public class MainActivity extends AppCompatActivity implements ListAdapter.OnItemClickListener{
 19 
 20     private DBHelper helper;
 21     private  ListView listView;
 22     private  ImageButton Add;
 23     private  ImageButton search;
 24     private List<costList>list;
 25 
 26     @Override
 27     protected void onCreate(Bundle savedInstanceState) {
 28         super.onCreate(savedInstanceState);
 29         setContentView(R.layout.activity_main);
 30         initView();
 31         initData();
 32     }
 33     //初始化
 34     @SuppressLint("Range")
 35     private void initData() {
 36         helper=new DBHelper(MainActivity.this);
 37         list=new ArrayList<>();
 38         SQLiteDatabase db=helper.getReadableDatabase();
 39         Cursor cursor=db.query("account",null,null,null,null,
 40                 null,null);
 41         while (cursor.moveToNext()){
 42             costList clist=new costList();//构造实例
 43             clist.set_id(cursor.getInt(cursor.getColumnIndex("_id")));
 44             clist.setTitle(cursor.getString(cursor.getColumnIndex("Title")));
 45             clist.setDate(cursor.getString(cursor.getColumnIndex("Date")));
 46             clist.setMoney(cursor.getString(cursor.getColumnIndex("Money")));
 47             list.add(clist);
 48         }
 49         listView = findViewById(R.id.list_view);
 50         //绑定适配器
 51         ListAdapter mAdapter = new ListAdapter(this,list);
 52         mAdapter.setOnItemClickListener(this);
 53         listView.setAdapter(mAdapter);
 54         db.close();
 55     }
 56     @Override
 57     public void onItemClick(int position) {
 58         // 处理点击事件的逻辑
 59         Log.d("Main", "jump");
 60         costList item = list.get(position);
 61         Intent intent = new Intent(MainActivity.this, upgrade_cost.class);
 62         intent.putExtra("item_id", item.get_id());
 63         startActivityForResult(intent, 1);
 64     }
 65 
 66     private void initView() {
 67         Add=findViewById(R.id.add);
 68         search=findViewById(R.id.search);
 69     }
 70 
 71 
 72 
 73     //事件:添加
 74     public void addAccount(View view){//跳转
 75         Intent intent=new Intent(MainActivity.this,new_cost.class);
 76         startActivityForResult(intent,1);
 77     }
 78     public void searchAccount(View view){
 79         Intent intent=new Intent(MainActivity.this,search_cost.class);
 80         startActivityForResult(intent,2);
 81     }
 82 
 83     @Override
 84     protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
 85         super.onActivityResult(requestCode, resultCode, data);
 86         if(requestCode==1&&resultCode==1)
 87         {
 88             this.initData();
 89         }
 90         if(requestCode==2&&resultCode==2){
 91             // 获取选择的日期数据
 92             String selectedDate = null;
 93             if (data != null) {
 94                 selectedDate = data.getStringExtra("selected_date");
 95                 // 根据选择的日期从数据库中检索相关账单数据并显示在主界面上
 96                 showBillsForSelectedDate(selectedDate);
 97             }
 98         }
 99     }
100 
101     private void showBillsForSelectedDate(String selectedDate) {
102         // 根据选择的日期从数据库中检索相关账单数据
103         List<costList> billList = helper.getBillsForDate(selectedDate); // 假设 DBHelper 中有一个方法可以根据日期检索相关账单数据
104 
105         // 使用适配器将账单数据绑定到 ListView 上
106         ListAdapter adapter = new ListAdapter(this, billList);
107         listView.setAdapter(adapter);
108     }
109 
110     public void refresh(View view) {
111         initView();
112         initData();
113     }
114 }

首先我们可以看到出去一些变量的声明,mainactivity主要先重写了一个onCreate函数,这里有必要说一下acivity的生命周期:

 

 

 

onCreate():Activity启动后第一个被调用的函数,常用来进行Activity的初始化,如创建View,绑定数据和恢复数据。

onStart():当Activity显示在屏幕上时,函数被调用。

onRestart():Activity从停止状态进入活动状态是调用。

onResume():Activity可以接受用户输入时,该函数被调用,此时的activity位于activity栈的栈顶。

onPause():当Activity进入暂停状态时,该函数被调用,一般用来保存持久的数据或释放占用的资源。

onStop():当Activity变为不可见后,该函数被调用,Activity进入停止状态。

onDestroy():在Activity被终止前,被调用。


这里看一下onCreate函数

onCreate()函数:用于activity初始化的时候。一般情况下,我们需在onCreate()中调用setContentView(int)函数填充屏幕的UI,通过findViewById(int)返回.xml文件中定义的视图或组件的ID。子类在重写onCreate()方法的时候必须调用父类的onCreate()方法,即super.onCreate(),否则会抛出异常。 我们在onCreate函数中调用了initData和initView函数用于实现布局的初始化,其中initData涉及到数据库操作和适配器填充数据,我们先不用了解之后会再介绍。

这里我们主要看一下在初始化之后还有着哪些操作,初始化之后可以看到对于其他功能的实现都有着一个用于实现跳转的startActivityForResult(Intent,int)方法,该方法是一种用于在 Android 应用程序中启动另一个活动(Activity)并期望在被启动的活动完成后接收结果的机制。

我们在增加按钮和查询按钮还有列表项都有着跳转的方法,同时在下文中还有着对应的处理返回结果的方法onActivityResult负责处理返回的状态码并执行对应的操作。

 

在startActivityForResult(Intent,int)方法中,我们可以看到有一个参数为Intent对象,安卓 Intent 是一种在 Android 应用程序之间传递信息的机制。它可以用于启动活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver),以及传递数据和操作等。这里给上一个简单介绍的链接 https://blog.csdn.net/m0_51947109/article/details/130466463

在使用该方法的时候可能会提示该方法已废弃,解决方案是使用 startActivityForResult(Intent, int, Bundle) 方法来代替。该方法允许你向要启动的活动传递附加数据。通过将 Bundle 对象作为第三个参数传递,你可以在发送给活动的 Intent 中包含额外的数据。

Bundle 的作用主要时用于传递数据;它所保存的数据是以key-value(键值对)的形式存在的,也就是说bundle是保存数据的容器,内部使用了Arraymap去存储数据,也提供了很多get,put方法。
  bundle传递的数据包括:string、int、boolean、byte、float、long、double等基本类型或它们对应的数组,也可以是对象或对象数组。当bundle传递的是对象或对象数组时,必须实现Serialiable或Parcelable接口。
  bundle主要用于以下3个场合:
  1. Activity状态数据的保存与恢复,涉及到两个回调:①void onSaveInstanceState(Bundle outState);② void onCreate(Bundle savedInstanceState);
  2. Fragment的setArguments方法:void setArgument(Bundle args);
  3. 消息机制中的Message的setData方法:void setData(Bundle data)。

利用该函数我们就可以在各个activity当中实现跳转,剩余的showBillsForSelectedData函数用于在查询时显示对应的数据

今天先介绍到这里,之后会介绍一下android的sqlite数据库的一些操作

posted @ 2024-02-18 15:38  起名字真难_qmz  阅读(70)  评论(0)    收藏  举报