本文实例为大家分享了Android手机开发设计之记事本功能,供大家参考,具体内容如下

一、需求分析

1.1业务需求分析

近年来,随着生活节奏的加快,工作和生活的双重压力全面侵袭着人们,如何避免忘记工作和生活中的诸多事情而造成不良的后果就显得非常重要。为此我们开发一款基于Android系统的简单记事本,其能够便携记录生活和工作对诸多事情,从而帮助人们有效地进行时间管理。

1.2功能需求分析

本记事本项目希望可以开发出一款符合用户生活工作习惯的简单应用,能够满足用户的各方面需求,可以对记事进行增加、查看、修改和删除,要求功能完善丰富并且具有良好的用户界面和交互体验。

二、项目设计

2.1功能模块设计

2.1.1记事本基本操作

记事本基本操作是该项目的核心部分,提供添加、查看、修改、删除记事本信息的功能,提供记事本动态更新的功能。

2.1.2 记事本主界面列表展示

用户可能需要创建许多记事事项,并且需要对这些记录事项进程基本操作,记事本的列表展示能使用户界面更加简洁清晰,且给用户带来使用方便。

2.1.3 记事本数据存储

记事本最重要功能即记录和保存用户易遗忘的日期和事件,为了持久地将用户记录事项信息保存下来,需要将这些信息存储到数据库中,记事本需要保存的信息字段有编号、事件内容和保存事件的具体时间。
其功能模块图如图所示。

2.2数据库设计

由上面的功能模块分析可知,本记事本项目的数据库设计主要包括三个字段名:编号id、事件内容content和保存事件的时间notetime,其数据库表如下表所示:

2.3界面设计

2.3.1记事本主界面

该界面主要包括添加按钮和记录事项列表。记事本主界面设计如下图所示。

2.3.2 添加记录事项界面

该界面主要包括清除内容和保存内容按钮以及文本编辑。记事本添加记录事项如下图所示。

三、项目实现

3.1 NotepadBean类

由于记事本中的每个记录都会有其唯一的编号id、记录内容notepadContent和保存记录的时间notepadTime属性,因此我们需要创建一个NotepadBean类用于存放这些属性,并实现其相应的getter和setter方法,其主要代码如下:

public class NotepadBean {
    private String id;//记录编号
    private String notepadContent;//记录的内容
    private String notepadTime;//保存记录的时间
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getNotepadContent() {
        return notepadContent;
    }
    public void setNotepadContent(String notepadContent) {
        this.notepadContent = notepadContent;
    }
    public String getNotepadTime() {
        return notepadTime;
    }
    public void setNotepadTime(String notepadTime) {
        this.notepadTime = notepadTime;
    }

}

3.2 NotepadAdapter类

由于记事本界面的记录列表是使用ListView控件展示,因此需要创建一个数据适配器NotepadAdapter类对ListView控件进行数据适配,我们可以先创建NotepadAdapter类,再在NotepadAdapter类中创建一个ViewHolder类初始化Item界面中的控件,其中主要代码如下:

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
    if (convertView==null){//加载Item界面对应的布局文件
        convertView=layoutInflater.inflate(R.layout.notepad_item,null);
        viewHolder=new ViewHolder(convertView);//创建ViewHolder对象
        convertView.setTag(viewHolder);//创建ViewHolder对象
    }else {
        viewHolder=(ViewHolder) convertView.getTag();//convertView关联ViewHolder对象
    }
    NotepadBean notepadBean=(NotepadBean)getItem(position);//将获取的数据显示到对应的控件上
    viewHolder.tvNotepadContent.setText(notepadBean.getNotepadContent());
    viewHolder.tvNotepadTime.setText(notepadBean.getNotepadTime());
    return convertView;
}
class ViewHolder{
    TextView tvNotepadContent;
    TextView tvNotepadTime;
    public ViewHolder(View view){
        tvNotepadContent=view.findViewById(R.id.item_content);//记录的内容
        tvNotepadTime=view.findViewById(R.id.item_time);//保存记录的时间
    }
}

3.3 SQLiteHelper类

在记事本程序中存储和读取记录的数据都是通过操作数据库完成的,我们需要创建SQLiteHelper类实现对数据库中表的增删改查,以及利用数据库中的工具类DBUtils来定义数据库的名称、表名、数据库版本、数据库表中的列名以及获取当前日期等信息,其主要代码如下:
创建数据库:

public SQLiteHelper(Context context){
    super(context, DBUtils.DATABASE_NAME,null,DBUtils.DATABASE_VERION);
    sqLiteDatabase=this.getWritableDatabase();
}

创建表:

@Override
public void onCreate(SQLiteDatabase db){
    db.execSQL("CREATE TABLE " DBUtils.DATABASE_TABLE "(" DBUtils.NOTEPAD_ID " INTEGER PRIMARY KEY AUTOINCREMENT," DBUtils.NOTEPAD_CONTENT " text, " DBUtils.NOTEPAD_TIME " text)");
}

添加数据:

public boolean insertData(String userContent,String userTime){
    ContentValues contentValues=new ContentValues();
    contentValues.put(DBUtils.NOTEPAD_CONTENT,userContent);
    contentValues.put(DBUtils.NOTEPAD_TIME,userTime);
    return sqLiteDatabase.insert(DBUtils.DATABASE_TABLE,null,contentValues)>0;
}

删除数据:

public boolean deleteData(String id){
    String sql=DBUtils.NOTEPAD_ID "=?";
    String[] contentValuesArray=new String[]{String.valueOf(id)};
    return sqLiteDatabase.delete(DBUtils.DATABASE_TABLE,sql,contentValuesArray)>0;
}

修改数据:

public boolean updateData(String id,String content,String userYear){
    ContentValues contentValues=new ContentValues();
    contentValues.put(DBUtils.NOTEPAD_CONTENT,content);
    contentValues.put(DBUtils.NOTEPAD_TIME,userYear);
    String sql=DBUtils.NOTEPAD_ID "=?";
    String[] strings=new String[]{id};
    return sqLiteDatabase.update(DBUtils.DATABASE_TABLE,contentValues,sql,strings)>0;
}

查询数据:

public List<NotepadBean> query(){
    List<NotepadBean>list=new ArrayList<NotepadBean>();
    Cursor cursor=sqLiteDatabase.query(DBUtils.DATABASE_TABLE,null,null,
            null,null,null,DBUtils.NOTEPAD_ID " desc");
    if (cursor!=null){
        while (cursor.moveToNext()){
            NotepadBean noteInfo=new NotepadBean();
            String id=String.valueOf(cursor.getInt(cursor.getColumnIndex(DBUtils.NOTEPAD_ID)));
            String content=cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_CONTENT));
            String time=cursor.getString(cursor.getColumnIndex(DBUtils.NOTEPAD_TIME));
            noteInfo.setId(id);
            noteInfo.setNotepadContent(content);
            noteInfo.setNotepadTime(time);
            list.add(noteInfo);
        }
        cursor.close();
    }
    return list;
}

3.4 NotepadActivity类

记事本主界面包含显示列表和添加按钮功能,我们创建NotepadActivity类实现,其中显示列表在NotepadActivity类中通过创建showQueryData()方法,在该方法中查询数据库存放的记录信息,并将该信息显示到记录列表中,其实现代码如下:

private void showQueryData(){
    if(list!=null){
        list.clear();
    }
    list=mSQLiteHelper.query();
    adapter=new NotepadAdapter(this,list);
    listView.setAdapter(adapter);
}

为“添加按钮”通过setOnClickListener()方法设置点击事件,当点击该按钮时,跳转到添加记录的界面,其实现代码如下:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listView=findViewById(R.id.listview);
    ImageView imageView=findViewById(R.id.add);
    initData();
    imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent=new Intent(NotepadActivity.this,RecordActivity.class);
            startActivityForResult(intent,1);
        }
    });
}

3.5 RecordActivity类

RecordActivity为修改记录,我们在NotepadActivity中通过listView的setOnItemClickListener()方法监听Item的点击事件,携带被点击Item的记录内容跳转到RecordActivity中,其会根据获取的数据显示记录的内容。另外当我们需要删除记事本列表中的记录时,需要长按列表中的Item,此时会弹出一个对话框提示是否删除Item对应的事件。setOnItemClickListener()方法代码如下:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?>parent,View view,int position,long id ){
            NotepadBean notepadBean=list.get(position);
            Intent intent=new Intent(NotepadActivity.this,RecordActivity.class);
            intent.putExtra("id",notepadBean.getId());
            intent.putExtra("content",notepadBean.getNotepadContent());
            intent.putExtra("time",notepadBean.getNotepadTime());
            NotepadActivity.this.startActivityForResult(intent,1);
        }
    });
    listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
            AlertDialog dialog;
            AlertDialog.Builder builder=new AlertDialog.Builder(NotepadActivity.this)
                    .setMessage("是否删除此记录?")
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            NotepadBean notepadBean=list.get(position);
                            if(mSQLiteHelper.deleteData(notepadBean.getId())){
                                list.remove(position);//删除对应的Item
                                adapter.notifyDataSetChanged();//更新记事本页面
                                Toast.makeText(NotepadActivity.this,"删除成功",Toast.LENGTH_LONG).show();
                            }

                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
            dialog=builder.create();
            dialog.show();
            return true;
        }
});

RecordActivity利用initData()函数接收传递的数据去,其代码如下:

public void initData(){
    mSQLiteHelper=new SQLiteHelper(this);
    noteName.setText("添加记录");
    Intent intent=getIntent();
    if(intent!=null){
        id=intent.getStringExtra("id");
        if(id!=null){
            noteName.setText("修改记录");
            content.setText(intent.getStringExtra("content"));
            note_time.setText(intent.getStringExtra("time"));
            note_time.setVisibility(View.VISIBLE);
        }
    }
}

同时,我们在RecordActivity中可以利用switch…case结构实现了编辑记录、保存和清除编辑的记录的功能,即通过EditText控件实现记录的编辑功能,为保存按钮设置点击事件;当点击保存按钮时将记录的内容和保存时间通过SQLiteHelper类的insertData()方法添加到数据库中;为清除按钮设置点击事件,当点击清除按钮时,将EditText控件的内容通过setText()方法置为空字符串。其OnClick()函数代码如下:

public void onClick(View v){
    switch (v.getId()){
        case R.id.note_back:
            finish();
            break;
        case R.id.delete:
            content.setText(" ");
            break;
        case R.id.note_save:
            String noteContent =content.getText().toString().trim();
            if(id!=null){
                //修改记录的功能
                if(noteContent.length()>0){
                    if (mSQLiteHelper.updateData(id,noteContent,DBUtils.getTime())){
                        showToast("修改成功");
                        setResult(2);
                        finish();
                    }else{
                        showToast("修改失败");
                    }
                } else{
                    showToast("修改的记录内容不能为空");
                }
            }else{
                //添加记录的功能
                if(noteContent.length()>0){
                    if (mSQLiteHelper.insertData(noteContent,DBUtils.getTime())){
                        showToast("保存成功");
                        setResult(2);
                        finish();
                    }else{
                        showToast("保存失败");
                    }
                } else{
                    showToast("保存的记录内容不能为空");
                }
            }
            break;
    }
}

四、项目测试

1、项目运行主界面。

2、点击主界面添加进入添加页面,输入“Android课程设计”然后点击保存按钮会返回主界面并弹出“保存成功”信息。

3、长按我们刚刚新建的记录“Android课程设计”会弹出删除对话框,点击确定即可删除,并弹出“删除成功”信息。

4、选择并打开“20182800”记录,将其修改为“20180000”,然后点击保存按钮,会弹出“修改成功”的信息。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

Android手机开发设计之记事本功能的更多相关文章

  1. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  4. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  5. Ionic – Splash Screen适用于iOS,但不适用于Android

    我有一个离子应用程序,其中使用CLI命令离子资源生成的启动画面和图标iOS版本与正在渲染的启动画面完美配合,但在Android版本中,只有在加载应用程序时才会显示白屏.我检查了config.xml文件,所有路径看起来都是正确的,生成的图像出现在相应的文件夹中.(我使用了splash.psd模板来生成它们.我错过了什么?这是config.xml文件供参考,我觉得我在这里做错了–解决方法在config.xml中添加以下键:它对我有用!

  6. ios – 无法启动iPhone模拟器

    /Library/Developer/CoreSimulator/Devices/530A44CB-5978-4926-9E91-E9DBD5BFB105/data/Containers/Bundle/Application/07612A5C-659D-4C04-ACD3-D211D2830E17/ProductName.app/ProductName然后,如果您在Xcode构建设置中选择标准体系结构并再次构建和运行,则会产生以下结果:dyld:lazysymbolbindingFailed:Symbol

  7. Xamarin iOS图像在Grid内部重叠

    heyo,所以在Xamarin我有一个使用并在其中包含一对,所有这些都包含在内.这在Xamarin.Android中看起来完全没问题,但是在Xamarin.iOS中,图像与标签重叠.我不确定它的区别是什么–为什么它在Xamarin.Android中看起来不错但在iOS中它的全部都不稳定?

  8. 在iOS上向后播放HTML5视频

    我试图在iPad上反向播放HTML5视频.HTML5元素包括一个名为playbackRate的属性,它允许以更快或更慢的速率或相反的方式播放视频.根据Apple’sdocumentation,iOS不支持此属性.通过每秒多次设置currentTime属性,可以反复播放,而无需使用playbackRate.这种方法适用于桌面Safari,但似乎在iOS设备上的搜索限制为每秒1次更新–在我的情况下太慢了.有没有办法在iOS设备上向后播放HTML5视频?解决方法iOS6Safari现在支持playbackRat

  9. 使用 Swift 语言编写 Android 应用入门

    Swift标准库可以编译安卓armv7的内核,这使得可以在安卓移动设备上执行Swift语句代码。做梦,虽然Swift编译器可以胜任在安卓设备上编译Swift代码并运行。这需要的不仅仅是用Swift标准库编写一个APP,更多的是你需要一些框架来搭建你的应用用户界面,以上这些Swift标准库不能提供。简单来说,构建在安卓设备上使用的Swiftstdlib需要libiconv和libicu。通过命令行执行以下命令:gitclonegit@github.com:SwiftAndroid/libiconv-libi

  10. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部