今天完成个人作业第一部分内容,其中最长打卡天数未能实现,打卡显示没有完成,在第二阶段会加以完善。
以下为个人代码
java代码方面,包括闹钟设定,登录设定,注册设定,封装类,连接数据库,创建表结构
package com.example.myapplication2; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import android.content.DialogInterface; import android.os.Bundle; public class AlarmActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_alarm); AlertDialog alert = new AlertDialog.Builder(this).create(); alert.setTitle("传播正能量"); alert.setMessage("赶紧摆烂"); alert.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) {} }); alert.show(); } }View Code
package com.example.myapplication2; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; public class FirstActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_clock,btn_time,btn_return; private UserDBHelper mHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first); btn_clock = findViewById(R.id.btn_clock); btn_time = findViewById(R.id.btn_time); btn_return = findViewById(R.id.btn_return); btn_clock.setOnClickListener(this); btn_time.setOnClickListener(this); btn_return.setOnClickListener(this); } @Override protected void onStart() { super.onStart(); mHelper = UserDBHelper.getInstance(this); mHelper.openWriteLink(); mHelper.openReadLink(); } @Override protected void onStop() { super.onStop(); mHelper.closeLink(); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.btn_clock: Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivity(intent); break; case R.id.btn_time: Intent intent1 = new Intent(FirstActivity.this, TimeActivity.class); startActivity(intent1); break; case R.id.btn_return: Intent intent2 = new Intent(FirstActivity.this, LoginActivity.class); startActivity(intent2); break; } } }View Code
package com.example.myapplication2; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.example.myapplication2.Until.ToastUntil; public class LoginActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_regist,btn_login; private EditText tv_name, tv_password; private UserDBHelper mHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); tv_name = findViewById(R.id.tv_name); tv_password = findViewById(R.id.tv_password); btn_regist = findViewById(R.id.btn_regist); btn_login = findViewById(R.id.btn_login); tv_name.setOnClickListener(this); tv_password.setOnClickListener(this); btn_regist.setOnClickListener(this); btn_login.setOnClickListener(this); } @Override protected void onStart() { super.onStart(); mHelper = UserDBHelper.getInstance(this); mHelper.openWriteLink(); mHelper.openReadLink(); } @Override protected void onStop() { super.onStop(); mHelper.closeLink(); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.btn_regist: Intent intent = new Intent(LoginActivity.this,RegisteActivity.class); startActivity(intent); case R.id.btn_login: String name = tv_name.getText().toString(); String password = tv_password.getText().toString(); if(name.equals("") || password.equals("")) { ToastUntil.show(this, "有输入为空"); } else { if (mHelper.search(name, password) == 0) { ToastUntil.show(this, "账户不存在"); } else if (mHelper.search(name, password) == 1) { ToastUntil.show(this, "登录成功"); Intent intent1 = new Intent(LoginActivity.this, FirstActivity.class); startActivity(intent1); } else if (mHelper.search(name, password) == 2) { ToastUntil.show(this, "密码错误"); } } } } }View Code
package com.example.myapplication2; public class Passage { private String usename; private String sometime; private String essential; private String word; private String day; public Passage() { } public Passage(String usename, String sometime, String essential, String word, String day) { this.usename = usename; this.sometime = sometime; this.essential = essential; this.word = word; this.day = day; } @Override public String toString() { return "Passage{" + "usename='" + usename + '\'' + ", sometime='" + sometime + '\'' + ", essential='" + essential + '\'' + ", word='" + word + '\'' + ", day='" + day + '\'' + '}'; } public String getUsename() { return usename; } public void setUsename(String usename) { this.usename = usename; } public String getSometime() { return sometime; } public void setSometime(String sometime) { this.sometime = sometime; } public String getEssential() { return essential; } public void setEssential(String essential) { this.essential = essential; } public String getWord() { return word; } public void setWord(String word) { this.word = word; } public String getDay() { return day; } public void setDay(String day) { this.day = day; } }View Code
package com.example.myapplication2; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import com.example.myapplication2.Until.ToastUntil; public class RegisteActivity extends AppCompatActivity implements View.OnClickListener { private EditText et_name, et_password, et_number, et_phone, et_class; private Button btn_registe, btn_cannel; private UserDBHelper mHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_registe); et_name = findViewById(R.id.et_name); et_password = findViewById(R.id.et_password); et_number = findViewById(R.id.et_number); et_phone = findViewById(R.id.et_phone); et_class = findViewById(R.id.et_class); findViewById(R.id.et_name).setOnClickListener(this); findViewById(R.id.et_password).setOnClickListener(this); findViewById(R.id.et_number).setOnClickListener(this); findViewById(R.id.et_phone).setOnClickListener(this); findViewById(R.id.et_class).setOnClickListener(this); findViewById(R.id.btn_registe).setOnClickListener(this); findViewById(R.id.btn_cannel).setOnClickListener(this); } @Override protected void onStart() { super.onStart(); mHelper = UserDBHelper.getInstance(this); mHelper.openWriteLink(); mHelper.openReadLink(); } @Override protected void onStop() { super.onStop(); mHelper.closeLink(); } @Override public void onClick(View view) { String name = et_name.getText().toString(); String password = et_password.getText().toString(); String number = et_number.getText().toString(); String phone = et_phone.getText().toString(); String classt = et_class.getText().toString(); User user = null; switch (view.getId()) { case R.id.btn_registe: user = new User(name, password, number, phone, classt); if(name.equals("") || password.equals("") || number.equals("") || phone.equals("") || classt.equals("")) { ToastUntil.show(this, "有输入为空"); } else if (mHelper.search1(name) == 1) { ToastUntil.show(this, "账户存在"); } else if(mHelper.search1(name) == 0) { if (mHelper.insert(user) > 0) { ToastUntil.show(this, "添加成功"); Intent intent = new Intent(RegisteActivity.this, LoginActivity.class); startActivity(intent); } } break; case R.id.btn_cannel: Intent intent = new Intent(RegisteActivity.this,LoginActivity.class); startActivity(intent); } } }View Code
package com.example.myapplication2; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import com.example.myapplication2.Until.ToastUntil; public class SecondActivity extends AppCompatActivity implements View.OnClickListener { private EditText et_usename, et_essential, et_word, et_day, et_sometime; private Button btn_add, btn_noadd; private UserDBHelp mHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); et_usename = findViewById(R.id.et_usename); et_essential = findViewById(R.id.et_essential); et_word = findViewById(R.id.et_word); et_sometime = findViewById(R.id.et_sometime); findViewById(R.id.et_usename).setOnClickListener(this); findViewById(R.id.et_essential).setOnClickListener(this); findViewById(R.id.et_word).setOnClickListener(this); findViewById(R.id.et_sometime).setOnClickListener(this); findViewById(R.id.btn_add).setOnClickListener(this); findViewById(R.id.btn_noadd).setOnClickListener(this); } @Override protected void onStart() { super.onStart(); mHelper = UserDBHelp.getInstance(this); mHelper.openWriteLink(); mHelper.openReadLink(); } @Override protected void onStop() { super.onStop(); mHelper.closeLink(); } @Override public void onClick(View view) { String usename = et_usename.getText().toString(); String essential = et_essential.getText().toString(); String word = et_word.getText().toString(); String sometime = et_sometime.getText().toString(); String day = String.valueOf(mHelper.search2(usename)); Passage passage = null; switch (view.getId()) { case R.id.btn_noadd: Intent intent = new Intent(SecondActivity.this, FirstActivity.class); startActivity(intent); break; case R.id.btn_add: passage = new Passage(usename, sometime, essential, word, day); if(usename.equals("") || essential.equals("") || word.equals("") || sometime.equals("")) { ToastUntil.show(this, "有输入为空"); } else { if (mHelper.insert(passage) > 0) { ToastUntil.show(this, "添加成功"); Intent intent1 = new Intent(SecondActivity.this, FirstActivity.class); startActivity(intent1); } break; } } } }View Code
package com.example.myapplication2; import androidx.appcompat.app.AppCompatActivity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TimePicker; import android.widget.Toast; import java.util.Calendar; public class TimeActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_time); final TimePicker timePicker = (TimePicker) findViewById(R.id.tv_time); timePicker.setIs24HourView(true); Button button1 = (Button) findViewById(R.id.btn_times); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(TimeActivity.this,AlarmActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(TimeActivity.this,0,intent,0); AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Calendar c = Calendar.getInstance(); c.set(Calendar.HOUR_OF_DAY,timePicker.getCurrentHour()); c.set(Calendar.MINUTE,timePicker.getCurrentMinute()); c.set(Calendar.SECOND,0); alarm.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(),pendingIntent); Toast.makeText(TimeActivity.this, "闹钟设置成功", Toast.LENGTH_SHORT).show(); } }); } }View Code
package com.example.myapplication2; public class User { private String name; private String password; private String number; private String classroom; private String phone; public User() { } public User(String username, String password, String number, String classroom, String phone) { this.name = username; this.password = password; this.number = number; this.classroom = classroom; this.phone = phone; } @Override public String toString() { return "User{" + "username='" + name + '\'' + ", password='" + password + '\'' + ", number='" + number + '\'' + ", classroom='" + classroom + '\'' + ", phone='" + phone + '\'' + '}'; } public String getUsername() { return name; } public void setUsername(String username) { this.name = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public String getClassroom() { return classroom; } public void setClassroom(String classroom) { this.classroom = classroom; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }View Code
package com.example.myapplication2; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class UserDBHelp extends SQLiteOpenHelper { private static final String DB_NAME = "note.db";//名字 private static final String TABLE_NAME = "notes";//名字 private static final int DB_VERSION = 1;//版本 private static UserDBHelp mHelper = null; private SQLiteDatabase mRDB = null; private SQLiteDatabase wRDB = null; private UserDBHelp(Context context) { super(context,DB_NAME,null,DB_VERSION); } public static UserDBHelp getInstance(Context context) { if (mHelper == null) { mHelper = new UserDBHelp(context); } return mHelper; } public SQLiteDatabase openReadLink()//读连接 { if(mRDB == null || !mRDB.isOpen()) { mRDB = mHelper.getReadableDatabase(); } return mRDB; } public SQLiteDatabase openWriteLink()//写连接 { if(wRDB == null || !wRDB.isOpen()) { } return wRDB; } public void closeLink() { if(mRDB != null && mRDB.isOpen()) { mRDB.close(); mRDB = null; } if(wRDB != null && wRDB.isOpen()) { wRDB.close(); wRDB = null; } } @Override public void onCreate(SQLiteDatabase db) { String sql1 = "CREATE TABLE IF NOT EXISTS "+TABLE_NAME+" (" + "usename VARCHAR NOT NULL," + "sometime VARCHAR NOT NULL," + "essential VARCHAR NOT NULL," + "word VARCHAR NOT NULL," + "day VARCHAR NOT NULL);"; db.execSQL(sql1); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } public long insert(Passage passage) { ContentValues values = new ContentValues(); values.put("usename",passage.getUsename()); values.put("sometime",passage.getSometime()); values.put("essential",passage.getEssential()); values.put("word",passage.getWord()); values.put("day",passage.getDay()); if (wRDB == null) { wRDB = mHelper.getWritableDatabase(); } return wRDB.insert(TABLE_NAME,null,values); } public int search2(String usename) { int i = 1; if (wRDB == null) { wRDB = mHelper.getReadableDatabase(); } Cursor cursor = wRDB.query("notes", new String[]{"usename"}, "usename=?", new String[]{usename}, null, null, null, null); while (cursor.moveToNext()) { if (usename.equals(cursor.getString(0))) { i++; } } return i; } }View Code
package com.example.myapplication2; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import com.example.myapplication2.Until.ToastUntil; public class UserDBHelper extends SQLiteOpenHelper { private static final String DB_NAME = "users.db";//名字 private static final String TABLE_NAME = "enroll";//名字 // private static final String TABLE_NAME1 = "notes";//名字 private static final int DB_VERSION = 1;//版本 private static UserDBHelper mHelper = null; private SQLiteDatabase mRDB = null; private SQLiteDatabase wRDB = null; private UserDBHelper(Context context) { super(context,DB_NAME,null,DB_VERSION); } public static UserDBHelper getInstance(Context context) { if (mHelper == null) { mHelper = new UserDBHelper(context); } return mHelper; } public SQLiteDatabase openReadLink()//读连接 { if(mRDB == null || !mRDB.isOpen()) { mRDB = mHelper.getReadableDatabase(); } return mRDB; } public SQLiteDatabase openWriteLink()//写连接 { if(wRDB == null || !wRDB.isOpen()) { } return wRDB; } public void closeLink() { if(mRDB != null && mRDB.isOpen()) { mRDB.close(); mRDB = null; } if(wRDB != null && wRDB.isOpen()) { wRDB.close(); wRDB = null; } } /* String sql1 = "CREATE TABLE IF NOT EXISTS "+TABLE_NAME1+" (" + "usename VARCHAR NOT NULL," + "sometime VARCHAR NOT NULL," + "essential VARCHAR NOT NULL," + "word VARCHAR NOT NULL," + "day VARCHAR NOT NULL);"; db.execSQL(sql1);*/ @Override public void onCreate(SQLiteDatabase db) { String sql = "CREATE TABLE IF NOT EXISTS "+TABLE_NAME+" (" + "name VARCHAR NOT NULL," + "password VARCHAR NOT NULL," + "number VARCHAR NOT NULL," + "classroom VARCHAR NOT NULL," + "phone VARCHAR NOT NULL);"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } public long insert(User user) { ContentValues values = new ContentValues(); values.put("name",user.getUsername()); values.put("password",user.getPassword()); values.put("number",user.getNumber()); values.put("classroom",user.getClassroom()); values.put("phone",user.getPhone()); if (wRDB == null) { wRDB = mHelper.getWritableDatabase(); } return wRDB.insert(TABLE_NAME,null,values); } public int search(String name,String password) { int i = 0; if (wRDB == null) { wRDB = mHelper.getReadableDatabase(); } Cursor cursor = wRDB.query("enroll", new String[]{"password"}, "name=?", new String[]{name}, null, null, null, null); while (cursor.moveToNext()) { if (password.equals(cursor.getString(0))) { i = 1; } else { i = 2; } } return i; } public int search1(String name) { int i = 0; if (wRDB == null) { wRDB = mHelper.getReadableDatabase(); } Cursor cursor = wRDB.query("enroll", new String[]{"name"}, "name=?", new String[]{name}, null, null, null, null); while (cursor.moveToNext()) { if (name.equals(cursor.getString(0))) { i = 1; } } return i; } }View Code
xml方面
包括登录界面,注册界面,闹钟提醒界面,打卡界面
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/btn_clock" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="打卡" /> <Button android:id="@+id/btn_time" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="定时" /> <Button android:id="@+id/btn_return" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="返回登录界面" /> </LinearLayout> </LinearLayout>View Code
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:orientation="horizontal"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="0.3" android:gravity="center" android:textSize="18dp" android:text="用户名:"/> <EditText android:id="@+id/tv_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginRight="20dp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:orientation="horizontal"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:gravity="center" android:textSize="18dp" android:layout_weight="0.3" android:text="密 码:"/> <EditText android:id="@+id/tv_password" android:layout_width="0dp" android:layout_height="wrap_content" android:inputType="textPassword" android:layout_weight="1" android:layout_marginRight="20dp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:layout_margin="5dp" android:text="登录" /> <Button android:id="@+id/btn_regist" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:layout_margin="5dp" android:text="注册" /> </LinearLayout> </LinearLayout> </LinearLayout>View Code
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- 用户名部分 --> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="用户名:" /> <EditText android:id="@+id/et_name" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="密 码:" /> <EditText android:id="@+id/et_password" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPassword" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="学号:" /> <EditText android:id="@+id/et_number" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="手机号:" /> <EditText android:id="@+id/et_phone" android:layout_width="match_parent" android:layout_height="wrap_content" /> <!-- 密码部分 --> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="用户班级" /> <EditText android:id="@+id/et_class" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_registe" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="注册" /> <Button android:id="@+id/btn_cannel" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="取消" /> </LinearLayout> </LinearLayout>View Code
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- 用户名部分 --> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="学号:" /> <EditText android:id="@+id/et_usename" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="时间:" /> <EditText android:id="@+id/et_sometime" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="关键字:" /> <EditText android:id="@+id/et_essential" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="总结:" /> <EditText android:id="@+id/et_word" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_add" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="增加" /> <Button android:id="@+id/btn_noadd" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="返回" /> </LinearLayout> </LinearLayout>View Code
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" android:orientation="vertical" tools:context=".TimeActivity"> <TimePicker android:id="@+id/tv_time" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_times" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="设置闹钟" /> </LinearLayout>View Code
以上为第一阶段所有代码
在第二阶段的代码会在之后的的日报中更新
标签:String,日报,et,软件工程,mHelper,2023,import,android,public From: https://www.cnblogs.com/ewqewq/p/17185004.html