安卓简易日程表实现

news/2024/12/23 0:53:22/

文章目录

    • 一、前言
    • 二、运行截图与功能说明
    • 三、知识点与参考
      • 1.数据库的操作
      • 2.显示月日历
      • 3.给TextView添加点击事件
    • 四、完整代码
      • 1.数据库有关的类MySQLiteOpenHelper
      • 2.activity_main.xml
      • 3.MainActivity
      • 4.用于删除和修改的Activity的布局activity_edit_schedule.xml
      • 5.EditScheduleActivity

一、前言

这次也没啥新的内容,本来准备用service的,但是接下去想做个打地鼠玩玩,这个就随便写了写。service的内容等之后有机会写吧。

二、运行截图与功能说明

功能主要实现:对日程的增删改查
大概就长这样:点击添加日程可以直接在该界面添加日程,点击某个日程则会跳转到另一个界面,可以进行删除和修改。
在这里插入图片描述 在这里插入图片描述

三、知识点与参考

1.数据库的操作

看我之前的一篇文章安卓之数据库(SQLite)

2.显示月日历

①布局文件中设置一个CalendarView

<CalendarViewandroid:id="@+id/calendarViewId"android:layout_width="match_parent"android:layout_height="match_parent"/>

②覆写setOnDateChangeListener

参考:日历视图(Calendarview)

3.给TextView添加点击事件

①设定TextView的clickable属性为true
xml文件中设置:android:clickable=“true”
java代码中设置:textView.setClickable(true);
②setOnClickListener
参考:Android 给TextView添加点击事件

四、完整代码

1.数据库有关的类MySQLiteOpenHelper

package com.example.yogi.mycalenderschedule;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.view.View;public class MySQLiteOpenHelper extends SQLiteOpenHelper{private static final String db_name = "MySchedule";//自定义的数据库名;private static final int version = 1;//版本号public MySQLiteOpenHelper(Context context) {super(context, db_name, null, version);}// 该方法会自动调用,首先系统会检查该程序中是否存在数据库名为‘MySchedule’的数据库// 如果存在则不会执行该方法,如果不存在则会执行该方法。@Overridepublic void onCreate(SQLiteDatabase db) {String  sql ="create table schedules(" +"id Integer primary key autoincrement," +     //id自增,只支持integer不支持int"scheduleDetail varchar(50)," +"time varchar(30)" +")";db.execSQL(sql);}//数据库版本更新时执行该方法,如果表已存在则先删除再调用onCreate重新创建@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("drop table if exists schedules");onCreate(db);}}

2.activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><CalendarViewandroid:id="@+id/calendar"android:layout_width="match_parent"android:layout_height="wrap_content"></CalendarView><ScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><Buttonandroid:id="@+id/addSchedule"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="添加日程" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><EditTextandroid:id="@+id/scheduleDetailInput"android:layout_width="290dp"android:layout_height="wrap_content"android:hint="请输入具体日程"android:visibility="gone"/><Buttonandroid:id="@+id/checkAdd"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="确认添加"android:visibility="gone"/></LinearLayout><TextViewandroid:id="@+id/schedule1"android:layout_width="match_parent"android:layout_height="wrap_content"android:visibility="gone"android:clickable="true"android:textSize="30dp"android:layout_marginLeft="20dp"/><TextViewandroid:id="@+id/schedule2"android:layout_width="match_parent"android:layout_height="wrap_content"android:visibility="gone"android:clickable="true"android:textSize="30dp"android:layout_marginLeft="20dp"/><TextViewandroid:id="@+id/schedule3"android:layout_width="match_parent"android:layout_height="wrap_content"android:visibility="gone"android:clickable="true"android:textSize="30dp"android:layout_marginLeft="20dp"/><TextViewandroid:id="@+id/schedule4"android:layout_width="match_parent"android:layout_height="wrap_content"android:visibility="gone"android:clickable="true"android:textSize="30dp"android:layout_marginLeft="20dp"/><TextViewandroid:id="@+id/schedule5"android:layout_width="match_parent"android:layout_height="wrap_content"android:visibility="gone"android:clickable="true"android:textSize="30dp"android:layout_marginLeft="20dp"/></LinearLayout></ScrollView></LinearLayout></android.support.constraint.ConstraintLayout>

3.MainActivity

package com.example.yogi.mycalenderschedule;import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;import java.util.Calendar;public class MainActivity extends AppCompatActivity  implements View.OnClickListener{private CalendarView calendarView;private EditText scheduleInput;private Context context;private Button addSchedule,checkAdd;private String dateToday;//用于记录今天的日期private MySQLiteOpenHelper mySQLiteOpenHelper;private SQLiteDatabase myDatabase;private TextView mySchedule[] = new TextView[5];@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();//这里不这样的话一进去就设置当天的日程会报错Calendar time = Calendar.getInstance();int year = time.get(Calendar.YEAR);int month = time.get(Calendar.MONTH)+1;//注意要+1,0表示1月份int day = time.get(Calendar.DAY_OF_MONTH);dateToday = year+"-"+month+"-"+day;//还要直接查询当天的日程,这个要放在initView的后面,不然会出问题queryByDate(dateToday);}private void initView() {mySQLiteOpenHelper = new MySQLiteOpenHelper(this);myDatabase = mySQLiteOpenHelper.getWritableDatabase();context = this;addSchedule = findViewById(R.id.addSchedule);addSchedule.setOnClickListener(this);checkAdd = findViewById(R.id.checkAdd);checkAdd.setOnClickListener(this);calendarView = findViewById(R.id.calendar);scheduleInput = findViewById(R.id.scheduleDetailInput);calendarView.setOnDateChangeListener(mySelectDate);mySchedule[0] = findViewById(R.id.schedule1);mySchedule[1] = findViewById(R.id.schedule2);mySchedule[2] = findViewById(R.id.schedule3);mySchedule[3] = findViewById(R.id.schedule4);mySchedule[4] = findViewById(R.id.schedule5);for(TextView v:mySchedule){v.setOnClickListener(this);}}private CalendarView.OnDateChangeListener mySelectDate = new CalendarView.OnDateChangeListener() {@Overridepublic void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) {dateToday = year+"-"+(month+1)+"-"+dayOfMonth;Toast.makeText(context, "你选择了:"+dateToday, Toast.LENGTH_SHORT).show();//得把用别的日期查出来的日程删除并将其隐藏for(TextView v:mySchedule){v.setText("");v.setVisibility(View.GONE);}queryByDate(dateToday);}};//根据日期查询日程private void queryByDate(String date) {//columns为null 查询所有列Cursor cursor = myDatabase.query("schedules",null,"time=?",new String[]{date},null,null,null);if(cursor.moveToFirst()){int scheduleCount = 0;do{String aScheduleDetail = cursor.getString(cursor.getColumnIndex("scheduleDetail"));mySchedule[scheduleCount].setText("日程"+(scheduleCount+1)+":"+aScheduleDetail);mySchedule[scheduleCount].setVisibility(View.VISIBLE);scheduleCount++;//一定要有这句 不然TextView不够多要数组溢出了if(scheduleCount >= 5)break;}while (cursor.moveToNext());}cursor.close();}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.addSchedule:addMySchedule();break;case R.id.checkAdd:checkAddSchedule();break;case R.id.schedule1:case R.id.schedule2:case R.id.schedule3:case R.id.schedule4:case R.id.schedule5:editSchedule(v);break;}}private void editSchedule(View v) {Intent intent = new Intent(MainActivity.this, EditScheduleActivity.class);String sch = ((TextView) v).getText().toString().split(":")[1];intent.putExtra("schedule",sch);startActivity(intent);}private void checkAddSchedule() {ContentValues values = new ContentValues();//第一个参数是表中的列名values.put("scheduleDetail",scheduleInput.getText().toString());values.put("time",dateToday);myDatabase.insert("schedules",null,values);scheduleInput.setVisibility(View.GONE);checkAdd.setVisibility(View.GONE);queryByDate(dateToday);//添加完以后把scheduleInput中的内容清除scheduleInput.setText("");}private void addMySchedule() {scheduleInput.setVisibility(View.VISIBLE);checkAdd.setVisibility(View.VISIBLE);}
}

4.用于删除和修改的Activity的布局activity_edit_schedule.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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"tools:context=".EditScheduleActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><Buttonandroid:id="@+id/deleteSchedule"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="删除该日程"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_marginVertical="20dp"><EditTextandroid:id="@+id/scheduleInput"android:layout_width="290dp"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/editBtn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="确认修改"/></LinearLayout></LinearLayout>
</android.support.constraint.ConstraintLayout>

5.EditScheduleActivity

package com.example.yogi.mycalenderschedule;import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;public class EditScheduleActivity extends AppCompatActivity  implements View.OnClickListener{private String schedule;private Button editBtn,deleteBtn;private EditText scheduleInput;private MySQLiteOpenHelper mySQLiteOpenHelper;private SQLiteDatabase myDatabase;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_edit_schedule);// 首先获取到意图对象Intent intent = getIntent();// 获取到传递过来的姓名schedule = intent.getStringExtra("schedule");initView();}private void initView() {mySQLiteOpenHelper = new MySQLiteOpenHelper(this);myDatabase = mySQLiteOpenHelper.getWritableDatabase();editBtn = findViewById(R.id.editBtn);editBtn.setOnClickListener(this);deleteBtn = findViewById(R.id.deleteSchedule);deleteBtn.setOnClickListener(this);scheduleInput = findViewById(R.id.scheduleInput);scheduleInput.setText(schedule);}@Overridepublic void onClick(View v){switch (v.getId()){case R.id.deleteSchedule:deleteMySchedule();break;case R.id.editBtn:editSchedule();break;}}private void editSchedule() {ContentValues values = new ContentValues();values.put("scheduleDetail",scheduleInput.getText().toString());myDatabase.update("schedules",values,"scheduleDetail=?",new String[]{schedule});Intent intent = new Intent(EditScheduleActivity.this, MainActivity.class);startActivity(intent);}private void deleteMySchedule() {myDatabase.delete("schedules","scheduleDetail=?",new String[]{schedule});Intent intent = new Intent(EditScheduleActivity.this, MainActivity.class);startActivity(intent);}
}

http://www.ppmy.cn/news/389518.html

相关文章

日程表详细设计说明

一、 功能分解 1. 日程管理 1.1新建&#xff1a; 功能详解&#xff1a;新建日程安排。日程安排项目包括&#xff1a;描述、地点、开始日期、开始时间、结束日期、结束时间、是否闹铃、闹铃提前时间、是否重复、重复类型、备注。 1.2查看&#xff1a; 功能详解&#…

日程表(生活作息)

精神鸦片&#xff1a;网络游戏&#xff0c;扑克麻将&#xff0c;抖音快手&#xff0c;微博微信&#xff0c;电影电视&#xff0c;娱乐八卦等 生活作息&#xff1a;06:30起床&#xff0c;10:30熄灯 良好行为习惯&#xff1a; 少玩手机&#xff0c;多玩电脑。 少逛抖音&#xf…

汽车电子Autosar之以太网SOMEIP

前言 首先&#xff0c;请问大家几个小小问题&#xff0c;你清楚&#xff1a; 你知道什么是SOME/IP吗&#xff1f;你知道为什么会产生SOME/IP即相关背景吗&#xff1f;你知道SOME/IP与SOA又有着哪些千丝万缕的联系呢&#xff1f;SOME/IP在实践中到底应该如何使用呢&#xff1f…

SpringCloud:分布式事务Seata

1.什么是分布式事务 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上&#xff0c;简单的说&#xff0c;就是一次大的操作由不同的小操作组成&#xff0c;这些小的操作分布在不同的服务器上&#xff0c;且属…

SpringBoot 集成 RocketMQ

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

【redis】数据类型,持久化、事务和锁机制、Java和redis交互、使用redis缓存、三大缓存问题

文章目录 Redis数据库NoSQL概论Redis安装和部署基本操作数据操作 数据类型介绍HashListSet和SortedSet 持久化RDBAOF 事务和锁机制锁 使用Java与Redis交互基本操作SpringBoot整合Redis 使用Redis做缓存Mybatis二级缓存Token持久化存储 三大缓存问题缓存穿透缓存击穿缓存雪崩 Re…

真鱼游来游去动态壁纸_超级漂亮的鱼池动态壁纸(Fish Pond)1.54中文完整版

超级漂亮的鱼池动态壁纸(Fish Pond)1.54中文完整版 书法字体2017.03.15Fish Pond 分享一款超级漂亮的鱼池动态壁纸应用-Fish Pond。Fish Pond鱼池动态壁纸是一款神奇的 3D动态壁纸&#xff0c;它可以将你的设备屏幕瞬间转变成一个精美绝伦、效果逼真的水景池塘! 池塘中居住着灵…

一文了解计算机视觉与自然语言处理融合的研究进展

来自&#xff1a;python遇见NLP 导读 通过语言给予智能体指示使其完成通用性的任务是人工智能领域的愿景之一。近年来有越来越多的学者试图通过融合计算机视觉与自然语言处理领域的相关技术以期实现此目标。 近年来&#xff0c;深度学习方法已经在计算机视觉、自然语言处理和自…