Android毕业设计记事本APP

目录
  • 前言
  • 功能概述
  • 系统设计
    • 启动界面
    • 引导界面
    • 更改口令界面
    • 主界面和编辑界面
      • 1 建表
      • 2 添加便签
      • 3 在主界面显示便签
      • 4 再次编辑该便签
    • 5 主界面和编辑界面布局

前言

该设计是一款轻量级的便签工具,使用Android Studio开发,风格简练,可实现便签的添加、删除、修改、查看功能。为保证一定的安全性,设置了进入口令,类似于应用锁,用户可以修改口令。主要使用的技术有共享参数、数据库、SwipeRefreshLayout控件。

功能概述

用户打开应用后,启动页会判断用户是否第一次打开,如果是第一次打开,跳转至引导页,引导用户设置进入口令;如果不是第一次打开,则跳转至口令确认界面,为保证应用干练简洁,启动页不设布局,不设延时,用户是感觉不到启动页的存在的。在口令确认界面,设置了“确认”和“更改”两个按钮,点击确认,如果口令正确会进入主界面;点击修改,则会跳转到修改口令界面。主界面实现了便签的预览和添加功能,底部有一个“添加”按钮,点击会进入便签编辑界面,编辑完成后点击右上角保存,会退出编辑界面,回到主界面,然后下拉刷新,就会出现刚刚编辑过的便签。再次点击便签,会进入编辑界面,可修改便签或删除便签。

系统设计

启动界面

启动页面的功能是用于判断用户是否第一次打开应用,如果是第一次打开应用,则跳转至引导页,引导用户设置进入口令;如果不是第一次打开应用,则跳转至口令确认界面。该设计是一款轻量级的便签工具,旨在方便、快捷,因此启动页不设延时和布局,仅用于实现判断用户是否第一次进入这一个功能。
这一功能实现的思路是,用共享参数存储一个布尔型变量,用true表示用户第一次进入,false表示用户不是第一次进入。每一次打开应用,都需要判断一次布尔型变量的真假。
在第一次进入启动页面时,为该布尔型变量赋初值true,if语句判断为真,执行如下操作:修改布尔型变量的值为false;跳转至引导页面。在第二次进入时,该布尔型变量的值为false,执行操作:跳转至口令确认界面。这样就实现了只在第一次打开应用时进入引导界面,不是第一次打开则进入口令确认界面。
代码如下:

public class LaunchActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_launch);
        firstRun();  //用于判断用户是否第一次进入
    }
    private void firstRun(){
        SharedPreferences sharedPreferences=getSharedPreferences("FirstRun",0);
        Boolean first_run=sharedPreferences.getBoolean("First",true);
//第一次进入,修改布尔变量值,跳转至引导页
        if(first_run){
            sharedPreferences.edit().putBoolean("First",false).commit();
            Intent intent=new Intent(LaunchActivity.this,GuideActivity.class);
            startActivity(intent);
            finish();
        }
//不是第一次进入,跳转至口令确认界面
        else {
            Intent intent=new Intent(LaunchActivity.this, LoginActivity.class);
            startActivity(intent);
            finish();
        }
    }
}

引导界面

引导界面的功能是,在用户第一次使用应用时,引导用户设置一个进入口令,也就是应用锁,旨在提供一定的安全性、私密性。
这一功能实现的思路是,在布局页面使用线性布局设置三个控件,第一个是TextView控件,设置文字“欢迎使用便签 请为自己设置一个进入口令吧!”,用于提示用户。第二个是EditText控件,设置提示文字“请输入由4位数字组成的口令”,让用户输入口令。第三个是Button控件,设置文字“确认”。在代码文件中,新建共享参数变量,添加键值对,key命名为”password”,用以存储用户口令。设置Button控件的点击事件,当用户点击确认按钮时,获取EditText控件的字符串并赋给共享参数,然后跳转至主界面。这样就实现了引导用户设置口令,并保存口令。
布局如下:

代码如下:

public class LoginActivity extends AppCompatActivity {

    //声明控件
    private Button mBtnConfirm;
    private Button mBtnAlter;
    private EditText mEt;
    private SharedPreferences mSharePreferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        //找到控件
        mBtnConfirm = findViewById(R.id.btn_Confirm);
        mBtnAlter = findViewById(R.id.btn_Alter);
        mEt = findViewById(R.id.et_main);

        //获取共享参数
        mSharePreferences = getSharedPreferences("data",MODE_PRIVATE);
        mBtnConfirm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //获取输入口令
                String input = mEt.getText().toString();
                //判断口令正误
                if(input.equals(mSharePreferences.getString("password",""))) {
                    Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                    startActivity(intent);
                    Toast.makeText(LoginActivity.this, "欢迎进入!", Toast.LENGTH_SHORT).show();
                    LoginActivity.this.finish();  //跳转到主界面后销毁该界面
                }
                else{
                    Toast.makeText(LoginActivity.this, "口令错误!", Toast.LENGTH_SHORT).show();
                }
            }
        });
        //跳转到修改口令界面
        mBtnAlter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(LoginActivity.this,AlterActivity.class);
                startActivity(intent);
                LoginActivity.this.finish();
            }
        });
    }
}

更改口令界面

该页面实现的功能是更改口令。实现该功能的思路是,在布局中设置两个EditText控件,第一个id为et_alter_1,并添加提示文字“请输入原口令”,第二个id为et_alter_2,添加提示文字“请输入修改后口令”,然后设置Button控件,添加文字“确认”。在代码文件中,设置Button控件的点击事件,当用户点击确认按钮时,获取et_alter_1的字符串并与共享参数password比较,相同说明原口令正确,然后获取et_alter_2的字符串并赋给password,并跳转至主界面;如果不同,说明原口令错误,弹出提示。
布局如下:

代码如下:

public class AlterActivity extends AppCompatActivity {

    //声明控件
    private Button mBtn;
    private EditText mEt_1;
    private EditText mEt_2;
    private EditText mEt_main;

    private SharedPreferences mSharePreferences;//读出
    private SharedPreferences.Editor mEditor;//存入

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alter);
        //找到控件
        mBtn = findViewById(R.id.btn_alter_confirm);
        mEt_1 = findViewById(R.id.et_alter_1);
        mEt_2 = findViewById(R.id.et_alter_2);
        mEt_main = findViewById(R.id.et_main);
        //获取共享参数
        mSharePreferences = getSharedPreferences("data",MODE_PRIVATE);
        mEditor = mSharePreferences.edit();
        //修改口令
        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //匹配原口令是否正确,如果正确,点击修改后跳转到主界面
                String input = mEt_1.getText().toString(); //获取输入口令
                if(mSharePreferences.getString("password","").equals(input)) {
                    mEditor.putString("password",mEt_2.getText().toString());//保存修改后口令
                    mEditor.commit();
                    Toast.makeText(AlterActivity.this, "修改成功! 欢迎进入!", Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(AlterActivity.this, MainActivity.class);
                    startActivity(intent);
                    AlterActivity.this.finish();
                }
                else{
                    Toast.makeText(AlterActivity.this, "原口令错误!", Toast.LENGTH_SHORT).show();
                }

            }
        });
    }
}

主界面和编辑界面

主界面的功能是添加便签、查看便签。点击添加按钮,会跳转至编辑界面,编辑完成点击保存会自动回到主界面,下拉刷新会出现刚刚编辑过的便签。点击该便签会再次进入编辑界面,可以进行修改和删除操作。
这两个界面的功能实现起来比较复杂,需要多个控件组合以及数据库的使用,并且功能之间相互联系,不能分开叙述。下面以“添加便签→在主界面显示便签→再次编辑该便签”为主线介绍这两个界面的功能实现。

1 建表

首先新建一个DatabaseHelper类,在这里定义建表语句:

public static final String CREATE_DIARY="create table Diary(" +
        "id integer primary key autoincrement," +
        "title text," +
        "content text)";

表名为Diary,有两列值,一列为title,表示便签的标题,一列为content,表示便签的内容。同时重写onCreate方法:

public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_DIARY);
}

2 添加便签

首先设置添加按钮的点击事件:

add.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent=new Intent(MainActivity.this,Detail.class);
        intent.putExtra("TAG",TAG_INSERT);
        startActivity(intent);
    }
});

在编辑界面,设置保存按钮的点击事件,当用户点击保存时,要将两个EditText控件的内容保存到数据库中,然后返回到主界面。注:编辑界面的布局用的menu布局。

public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
        case R.id.save:
            if(tag==TAG_INSERT) {
                ContentValues values = new ContentValues();
                values.put("title", title.getText().toString());
                values.put("content", content.getText().toString());
                db.insert(TABLE_NAME, null, values);
                values.clear();
                Toast.makeText(this, "Save", Toast.LENGTH_SHORT).show();
                finish();
                break;
	  }

3 在主界面显示便签

回到主界面后,需要把刚刚添加的便签显示出来。这里需要用到SwipeRefreshLayout控件、ListView控件和数组适配器ArrayAdapter。
首先需要查询数据库,将便签的标题添加到列表项目中:

private void init(){
    db=dbHelper.getWritableDatabase();
    diary.clear();
    //查询数据库,将title一列添加到列表项目中
    Cursor cursor=db.query(TABLE_NAME,null,null,null,null,null,null);
    if(cursor.moveToFirst()){
        String diary_item;
        do{
            diary_item=cursor.getString(cursor.getColumnIndex("title"));
            diary.add(diary_item);
        }while(cursor.moveToNext());
    }
    cursor.close();
    adapter=new ArrayAdapter<String>(
            MainActivity.this,android.R.layout.simple_list_item_1,diary);
    listView=(ListView)findViewById(R.id.list_item);
    listView.setAdapter(adapter);
}
然后通过SwipeRefreshLayout控件下拉刷新,让便签标题在主界面显示出来:
swipeRefresh=(SwipeRefreshLayout)findViewById(R.id.swipe_refresh);
swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout
        .OnRefreshListener() {
    @Override
    public void onRefresh() {
        refresh();
    }
});
private void refresh(){
    new Thread(new Runnable(){
        @Override
        public void run() {
            try{
                Thread.sleep(1000);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    init();
                    swipeRefresh.setRefreshing(false);
                }
            });
        }
    }).start();
}

4 再次编辑该便签

标题在主界面显示之后,需要通过点击标题,再次进入编辑界面,进行修改或删除操作。
首先要设置列表项目点击事件:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            Intent intent=new Intent(MainActivity.this,Detail.class);
            Id=getDiaryId(position);
            //  Log.d("MainActivity",""+id);
            intent.putExtra("ID",Id);
            intent.putExtra("TAG",TAG_UPDATE);
            startActivity(intent);
        }
    });
}
 private int getDiaryId(int position){
        //获取所点击的日记的title
        int Id;
        select_item=diary.get(position);
        //获取id
        db=dbHelper.getWritableDatabase();
        Cursor cursor=db.query(TABLE_NAME,new String[]{"id"},"title=?",
                new String[]{select_item},null,null,null);
        cursor.moveToFirst();
        Id=cursor.getInt(cursor.getColumnIndex("id"));
        return Id;
    }
}

然后在编辑界面,要呈现出用户点击的便签对应的内容,这一功能通过数据库查询id实现。在编辑界面代码中,获得主界面传过来的id,查询该id对应的表,并将该表的title列和content列赋值给对应的两个EditText控件:

id=intent.getIntExtra("ID",-1);
Cursor cursor=db.query(TABLE_NAME,null,"id=?",
        new String[]{String.valueOf(id)},null,null,null);
if(cursor.moveToFirst()){
    String select_title=cursor.getString(cursor.getColumnIndex("title"));
    String select_content=cursor.getString(cursor.getColumnIndex("content"));
    title.setText(select_title);
    content.setText(select_content);
}

在编辑完成后,用户点击保存,即可保存修改后的内容。因为保存按钮实际上执行了两个功能,一个是新建便签时,实际上执行的是数据库的insert功能,一个是修改便签时,实际上执行的是数据库的update功能,所以保存按钮的点击事件需要用if语句来区分这两种情况:

if(tag==TAG_INSERT) {
    ContentValues values = new ContentValues();
    values.put("title", title.getText().toString());
    values.put("content", content.getText().toString());
    db.insert(TABLE_NAME, null, values);
    values.clear();
    Toast.makeText(this, "Save", Toast.LENGTH_SHORT).show();
    finish();
    break;
}else if(tag==TAG_UPDATE){
    //修改title和content
    String update_title=title.getText().toString();
    String update_content=content.getText().toString();
    ContentValues values=new ContentValues();
    values.put("title",update_title);
    values.put("content",update_content);
    db.update(TABLE_NAME,values,"id=?",new String[]{String.valueOf(id)});
    finish();
    break;
}

用户点击删除,即可删除便签。实际上就是设置删除按钮的点击事件,让其执行数据库delete操作:

if(tag==TAG_UPDATE) {
    db.delete(TABLE_NAME,"id=?",new String[]{String.valueOf(id)});
}
Toast.makeText(this,"Delete",Toast.LENGTH_SHORT).show();
finish();

这样,就完成主界面和编辑界面的所有功能。

5 主界面和编辑界面布局


到此这篇关于Android毕业设计记事本APP的文章就介绍到这了,更多相关Android记事本内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android BindService使用案例讲解

    最近学习了一下Android里面的Service的应用,在BindService部分小卡了一下,主要是开始没有彻底理解为什么要这么实现. BindService和Started Service都是Service,有什么地方不一样呢: 1. Started Service中使用StartService()方法来进行方法的调用,调用者和服务之间没有联系,即使调用者退出了,服务依然在进行[onCreate()-  >onStartCommand()->startService()->onDes

  • Android多返回栈技术

    目录 1.系统返回按钮的乐趣 2.Fragment 中的多返回栈 3.排除 Fragment 在技术上的障碍 4.Fragment 中值得期待的地方 4.使用 Navigation 将多返回栈适配到任意屏幕类型 5.在 Navigation 中启用多返回栈 5.保存状态,锁定用户 1.系统返回按钮的乐趣 无论您在使用 Android 全新的 手势导航 还是传统的导航栏,用户的 "返回" 操作是 Android 用户体验中关键的一环,把握好返回功能的设计可以使应用更加贴近整个生态系统.

  • Android自定义view之3D正方体效果实例

    目录 前言 一.小提 二.将传感器改成事件分发机制 三.使用 四.源码 总结 前言 在之前写了一篇关于3D效果的文章,借助传感器展示,有小伙伴问可不可以改成手势滑动操作(事件分发),所以出一篇文章 传感器相关文章链接:Android 3D效果的实现 一.小提 相对于常见的自定义view而言,继承的GLSurfaceView只有两个构造函数.可以理解为没有提供获取自定义属性的方法. public TouchSurfaceView(Context context) { super(context);

  • Android毕业设计备忘录APP

    目录 1.系统需求分析 1.2 系统需求 功能&说明 1.3 该项目涉及到的技术点 2.数据存储设计 2.1 SharedPrefenrences/SQLite存储介绍 SharedPrefenrences : SQLite存储 2.2数据表结构 3.具体编码及截图 3.1 主界面 3.2 各功能模块 4 总结 源码放到GitHub上了,大家可以看一下 https://github.com/become-better1/hh 1.系统需求分析 1.1 系统功能及框图 该项目实现了备忘录的创建,修

  • Android ExpandableListView使用方法案例详解

    目录 一.前言 二.实现的功能 三.具体代码 1.主xml代码 2.父布局xml代码 3.子布局xml代码 4.主activity代码 5.adapter代码 一.前言   "好记性不如烂笔头",再次验证了这句话是真的很有道理啊,一个月前看了一下ExpandableListView的使用,今天再看居然忘了这个是干啥的了,今天就详细讲解一下ExpandableListView的使用方法,感觉对于二级条目显示功能都可以实现. 二.实现的功能 1.可实现二级列表条目显示功能,具体包括可自定义

  • Android自定义软键盘的步骤记录

    目录 效果图 实现自定义软键盘 1.通过xml定义键盘 2.将xml文件与keyboardview绑定起来 3.处理点击事件onKey 附赠一些实用的效果处理 总结 效果图 还是咱们的老规矩,先放最终效果图

  • Android Intent与IntentFilter案例详解

    1. 前言        在Android中有四大组件,这些组件中有三个组件与Intent相关,可见Intent在Android整个生态中的地位高度.Intent是信息的载体,用它可以去请求组件做相应的操作,但是相对于这个功能,Intent本身的结构更值得我们去研究. 2. Intent与组件        Intent促进了组件之间的交互,这对于开发者非常重要,而且它还能做为消息的载体,去指导组件做出相应的行为,也就是说Intent可以携带数据,传递给Activity/Service/Broa

  • 详解Android壁纸服务的启动过程

    壁纸基础 android中的壁纸分为动态壁纸和静态壁纸两种,两种类型的壁纸都以Service的类型运行在系统后台. 静态壁纸:仅以图片的形式进行展示对于静态壁纸,可以使用WallpaperManager中的getDrawable()等接口获取到当前的bitmap图像. 动态壁纸:显示的内容为动态的内容,同时可以对用户的操作做出响应对于动态壁纸的实时图像,是没办法通过android中原生的接口获取到,需要获取到动态壁纸的图像得自己修改源码. 壁纸实现时涉及的几个主要的类: WallpaperSer

  • Android自定义view之利用drawArc方法实现动态效果(思路详解)

    目录 前言 一.准备 1.测量 2.初始化画笔 3.自定义属性 二.关键方法介绍 drawArc 三.实现 1.思路 2.效果图 前言 前几天看了一位字节Android工程师的一篇博客,他实现的是歌词上下滚动的效果,实现的关键就是定义一个偏移量,然后根据情况去修改这个值,最后触发View的重绘来达到效果.于是今天根据这个思路来写一篇简单的文章.欢迎留言 一.准备 在这之前呢,还是得简单描述一下自定义view中的一些准备工作 1.测量 @Override protected void onSize

  • Android毕业设计记事本APP

    目录 前言 功能概述 系统设计 启动界面 引导界面 更改口令界面 主界面和编辑界面 1 建表 2 添加便签 3 在主界面显示便签 4 再次编辑该便签 5 主界面和编辑界面布局 前言 该设计是一款轻量级的便签工具,使用Android Studio开发,风格简练,可实现便签的添加.删除.修改.查看功能.为保证一定的安全性,设置了进入口令,类似于应用锁,用户可以修改口令.主要使用的技术有共享参数.数据库.SwipeRefreshLayout控件. 功能概述 用户打开应用后,启动页会判断用户是否第一次打

  • android实现记事本app

    自己写的一个简单的记事本app,效果如下: 一.首先是第一个界面的编写,最上面是一个TextView,中间是一个Linearlayout中嵌套一个listview布局,最下面是一个button.下面附上第一个页面的简单布局xml文件. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" androi

  • Android实现记事本功能(26)

    本文实例为大家分享了Android实现记事本功能的具体代码,供大家参考,具体内容如下 MainActivity.java代码: package siso.smartnotef.activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.

  • Android 破解视频App去除广告功能详解及解决办法总结

    Android 破解视频App去除广告功能 作为一个屌丝程序猿也有追剧的时候,但是当打开视频app的时候,那些超长的广告已经让我这个屌丝无法忍受了,作为一个程序猿看视频还要出现广告那就是打我脸,但是我有没有钱买会员,只能靠着毕生技能去耍耍去除广告了.下面就来介绍一下如何进行视频广告的去除. 一.视频广告播放原理 首先我们需要了解的一个基本知识点那就是广告其实也是一段视频,那么他肯定有请求地址和播放地址.那么我们的思路就来了,如果能够得到这些地址的话,我们就可以去除广告了,为什么呢?因为我们知道所

  • Android桌面组件App Widget用法入门教程

    本文实例讲述了Android桌面组件App Widget用法.分享给大家供大家参考.具体如下: Android开发应用除了程序应用,还有App Widget应用.好多人会开发程序应用而不会开发App Widget应用.本帖子就是帮助大家学习如何开发App Widget应用的. 先简单说说App Widget的原理.App Widget是在桌面上的一块显示信息的东西,通过单击App Widget跳转到程序入口类.而系统自带的程序,典型的App Widget是music,这个Android内置的音乐

  • Android桌面插件App Widget用法分析

    本文实例讲述了Android桌面插件App Widget用法.分享给大家供大家参考,具体如下: 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget)是微小的应用程序视图,可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新.你可以通过一个App Widget provider来发布一个Widget.可以容纳其它App Widget的应用程序组件被称为App Widget宿主.下面的截屏显示了一个音乐App Widget. appwidget 这篇文章描述了如何使用Ap

  • Android笔记之:App应用之发布各广告平台版本的详解

    Android的广告平台是很多的,各市场对各平台的接受程度是不一样的,Android的开发者如果想集成广告基本要考虑下面两个问题:(1)集成什么广告,会赚钱?(2)集成什么广告,不会被市场拒绝?最终的结果往往是折中的.第一个问题是广告平台的判断问题,我没有发言权去评论,本文主要是针对第二个问题展开.解决方案就是打包应用的不同广告平台版本,本文接下来逐一展开相关话题. 1. 基础本文其实是针对<Android笔记之:App模块化及工程扩展的应用>和<Android笔记之:App自动化之使用

  • Android开发之App widget用法实例分析

    本文实例讲述了Android开发之App widget用法.分享给大家供大家参考,具体如下: 放在桌面上的控件叫做--App widget,例如可以在桌面上添加按钮.图片等等控件,例如桌面播放器的控制面板 AppWidgetProviderInfo对象,它为App Widget提供元数据,包括布局.更新频率等等数据,这个对象不是由我们自己生成的,而是由android自己定义配置完成,这个对象被定义在XML文件中 1.定义AppWidgetProviderInfo对象,在res/xml文件夹当中定

  • Android如何实现APP自动更新

    先来看看要实现的效果图: 对于安卓用户来说,手机应用市场说满天飞可是一点都不夸张,比如小米,魅族,百度,360,机锋,应用宝等等,当我们想上线一款新版本APP时,先不说渠道打包的麻烦,单纯指上传APP到各大应用市场的工作量就已经很大了,好不容易我们把APP都上传完了,突然发现一个会导致应用闪退的小Bug,这时那个崩溃啊,明明不是很大的改动,难道我们还要再去重新去把各大应用市场的版本再上传更新一次?相信我,运营人员肯定会弄死你的!! 有问题,自然就会有解决问题的方案,因此我们就会想到如果在APP里

随机推荐