博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Android】12.6 利用Intent实现记事本功能(NotePad)
阅读量:6117 次
发布时间:2019-06-21

本文共 12706 字,大约阅读时间需要 42 分钟。

分类:C#、Android、VS2015;

创建日期:2016-02-23

一、简介

这个例子演示如何实现一个简单的记事本功能。

该例子提前使用了后面章节将要介绍的SQLLite数据库。

二、示例—ch1205NotePadDemo

1、运行截图

单击右上角【…】会弹出【添加】菜单项,长按某条记录会弹出快捷菜单【删除】项。

2、主要设计步骤

(1)添加引用

鼠标右击【引用】à【添加引用】,在弹出的窗口中勾选“System.Data”和“System.Data.SQlite”,如下图所示:

注意:不需要通过NuGet添加SQLite程序包,只需要按这种方式添加即可。

(2)添加图片

到Android SDK API 23的Samples的NotePad例子下找到app_notes.png,将其添加到该项目中,并将其换名为ch12_app_notes.png。

(3)添加ch1205_NoteEditor.axml文件

(4)添加ch1205_Main.axml文件

(5)添加ch1205Note.cs文件

using System;namespace MyDemos.SrcDemos{    class ch1205Note : Java.Lang.Object    {        public long Id { get; set; }        public string Body { get; set; }        public DateTime ModifiedTime { get; set; }        public ch1205Note()        {            Id = -1L;            Body = string.Empty;        }        public ch1205Note(long id, string body, DateTime modified)        {            Id = id;            Body = body;            ModifiedTime = modified;        }        public override string ToString()        {            return ModifiedTime.ToString();        }    }}

(6)添加ch1205LinedEditText.cs文件

using Android.Content;using Android.Runtime;using Android.Widget;using Android.Graphics;using Android.Util;namespace MyDemos.SrcDemos{    [Register("MyDemos.SrcDemos.ch1205LinedEditText")]    class ch1205LinedEditText : EditText    {        private Rect rect;        private Paint paint;        // 为了LayoutInflater需要提供此构造函数        public ch1205LinedEditText(Context context, IAttributeSet attrs)            : base(context, attrs)        {            rect = new Rect();            paint = new Paint();            paint.SetStyle(Android.Graphics.Paint.Style.Stroke);            paint.Color = Color.LightGray;        }        protected override void OnDraw(Canvas canvas)        {            int count = LineCount;            for (int i = 0; i < count; i++)            {                int baseline = GetLineBounds(i, rect);                canvas.DrawLine(rect.Left, baseline + 1, rect.Right, baseline + 1, paint);            }            base.OnDraw(canvas);        }    }}

(7)添加ch1205NoteRepository.cs文件

using System;using System.Collections.Generic;using Mono.Data.Sqlite;namespace MyDemos.SrcDemos{    class ch1205NoteRepository    {        private static string db_file = "notes.db3";        private static SqliteConnection GetConnection()        {            var dbPath = System.IO.Path.Combine(                System.Environment.GetFolderPath(                    System.Environment.SpecialFolder.Personal), db_file);            bool exists = System.IO.File.Exists(dbPath);            if (!exists) SqliteConnection.CreateFile(dbPath);            var conn = new SqliteConnection("Data Source=" + dbPath);            if (!exists) CreateDatabase(conn);            return conn;        }        private static void CreateDatabase(SqliteConnection connection)        {            var sql = "CREATE TABLE ITEMS (Id INTEGER PRIMARY KEY AUTOINCREMENT, Body ntext, Modified datetime);";            connection.Open();            using (var cmd = connection.CreateCommand())            {                cmd.CommandText = sql;                cmd.ExecuteNonQuery();            }            // Create a sample note to get the user started            sql = "INSERT INTO ITEMS (Body, Modified) VALUES (@Body, @Modified);";            using (var cmd = connection.CreateCommand())            {                cmd.CommandText = sql;                cmd.Parameters.AddWithValue("@Body", "今天有个约会");                cmd.Parameters.AddWithValue("@Modified", DateTime.Now);                cmd.ExecuteNonQuery();            }            connection.Close();        }        public static IEnumerable
GetAllNotes() { var sql = "SELECT * FROM ITEMS;"; using (var conn = GetConnection()) { conn.Open(); using (var cmd = conn.CreateCommand()) { cmd.CommandText = sql; using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { yield return new ch1205Note( reader.GetInt32(0), reader.GetString(1), reader.GetDateTime(2)); } } } } } public static ch1205Note GetNote(long id) { var sql = "SELECT * FROM ITEMS WHERE Id = id;"; using (var conn = GetConnection()) { conn.Open(); using (var cmd = conn.CreateCommand()) { cmd.CommandText = sql; using (var reader = cmd.ExecuteReader()) { if (reader.Read()) return new ch1205Note(reader.GetInt32(0), reader.GetString(1), reader.GetDateTime(2)); else return null; } } } } public static void DeleteNote(ch1205Note note) { var sql = string.Format("DELETE FROM ITEMS WHERE Id = {0};", note.Id); using (var conn = GetConnection()) { conn.Open(); using (var cmd = conn.CreateCommand()) { cmd.CommandText = sql; cmd.ExecuteNonQuery(); } } } public static void SaveNote(ch1205Note note) { using (var conn = GetConnection()) { conn.Open(); using (var cmd = conn.CreateCommand()) { if (note.Id < 0) { // Do an insert cmd.CommandText = "INSERT INTO ITEMS (Body, Modified) VALUES (@Body, @Modified); SELECT last_insert_rowid();"; cmd.Parameters.AddWithValue("@Body", note.Body); cmd.Parameters.AddWithValue("@Modified", DateTime.Now); note.Id = (long)cmd.ExecuteScalar(); } else { // Do an update cmd.CommandText = "UPDATE ITEMS SET Body = @Body, Modified = @Modified WHERE Id = @Id"; cmd.Parameters.AddWithValue("@Id", note.Id); cmd.Parameters.AddWithValue("@Body", note.Body); cmd.Parameters.AddWithValue("@Modified", DateTime.Now); cmd.ExecuteNonQuery(); } } } } }}

(8)添加ch1205NoteAdapter.cs文件

using Android.App;using Android.Content;using Android.Widget;namespace MyDemos.SrcDemos{    class ch1205NoteAdapter : ArrayAdapter    {        private Activity activity;        public ch1205NoteAdapter(Activity activity, Context context, int textViewResourceId, ch1205Note[] objects)            : base(context, textViewResourceId, objects)        {            this.activity = activity;        }        public override Android.Views.View GetView(int position, Android.Views.View convertView, Android.Views.ViewGroup parent)        {            //Get our object for this position            var item = (ch1205Note)GetItem(position);            // 如果convertView不为null则重用它,否则从当前布局中填充(inflate)它。            // 由于这种方式不是每次都填充一个新的view,因此可提高性能。            var view = (convertView ?? activity.LayoutInflater.Inflate(                Resource.Layout.ch1205_Main, parent, false)) as LinearLayout;            view.FindViewById
(Resource.Id.body).Text = Left(item.Body.Replace("\n", " "), 25); view.FindViewById
(Resource.Id.modified).Text = item.ModifiedTime.ToString(); return view; } private string Left(string text, int length) { if (text.Length <= length) return text; return text.Substring(0, length); } }}

(9)添加ch1205NoteEditorActivity.cs文件

using Android.App;using Android.Content;using Android.OS;using Android.Widget;using Android.Content.PM;namespace MyDemos.SrcDemos{    [Activity(Label = "ch1205NoteEditorActivity",     ScreenOrientation = ScreenOrientation.Sensor,    ConfigurationChanges = ConfigChanges.KeyboardHidden | ConfigChanges.Orientation)]    public class ch1205NoteEditorActivity : Activity    {        private ch1205Note note;        private EditText text_view;        protected override void OnCreate(Bundle savedInstanceState)        {            base.OnCreate(savedInstanceState);            SetContentView(Resource.Layout.ch1205_NoteEditor);            text_view = FindViewById
(Resource.Id.note); var note_id = Intent.GetLongExtra("note_id", -1L); if (note_id < 0) note = new ch1205Note(); else note = ch1205NoteRepository.GetNote(note_id); } protected override void OnResume() { base.OnResume(); text_view.SetTextKeepState(note.Body); } protected override void OnPause() { base.OnPause(); // 如果是新建的记事本且没有内容,不保存直接返回。 if (IsFinishing && note.Id == -1 && text_view.Text.Length == 0) return; // 保存记事本 note.Body = text_view.Text; ch1205NoteRepository.SaveNote(note); } }}

(10)添加ch1205NotePadMain.cs文件

using System.Linq;using Android.App;using Android.Content;using Android.OS;using Android.Views;using Android.Widget;namespace MyDemos.SrcDemos{    [Activity(Label = "ch1205NotePadMain")]    public class ch1205NotePadMain : ListActivity    {        // 菜单项        public const int MenuItemDelete = Menu.First;        public const int MenuItemInsert = Menu.First + 1;        protected override void OnCreate(Bundle savedInstanceState)        {            base.OnCreate(savedInstanceState);            SetDefaultKeyMode(DefaultKey.Shortcut);            ListView.SetOnCreateContextMenuListener(this);            PopulateList();        }        public void PopulateList()        {            // 获取存放到列表中的所有记事本项            var notes = ch1205NoteRepository.GetAllNotes();            var adapter = new ch1205NoteAdapter(this, this, Resource.Layout.ch1205_Main, notes.ToArray());            ListAdapter = adapter;        }        public override bool OnCreateOptionsMenu(IMenu menu)        {            base.OnCreateOptionsMenu(menu);            menu.Add(0, MenuItemInsert, 0, "添加")                .SetShortcut('3', 'a')                .SetIcon(Android.Resource.Drawable.IcMenuAdd);            return true;        }        public override bool OnOptionsItemSelected(IMenuItem item)        {            switch (item.ItemId)            {                case MenuItemInsert:  // 通过intent添加新项                    var intent = new Intent(this, typeof(ch1205NoteEditorActivity));                    intent.PutExtra("note_id", -1L);                    StartActivityForResult(intent, 0);                    return true;            }            return base.OnOptionsItemSelected(item);        }        public override void OnCreateContextMenu(IContextMenu menu, View view, IContextMenuContextMenuInfo menuInfo)        {            var info = (AdapterView.AdapterContextMenuInfo)menuInfo;            var note = (ch1205Note)ListAdapter.GetItem(info.Position);            menu.Add(0, MenuItemDelete, 0, "删除");        }        public override bool OnContextItemSelected(IMenuItem item)        {            var info = (AdapterView.AdapterContextMenuInfo)item.MenuInfo;            var note = (ch1205Note)ListAdapter.GetItem(info.Position);            switch (item.ItemId)            {                case MenuItemDelete:  // 删除该记事本项                    ch1205NoteRepository.DeleteNote(note);                    PopulateList();                    return true;            }            return false;        }        protected override void OnListItemClick(ListView l, View v, int position, long id)        {            var selected = (ch1205Note)ListAdapter.GetItem(position);            // 执行activity,查看/编辑当前选中的项            var intent = new Intent(this, typeof(ch1205NoteEditorActivity));            intent.PutExtra("note_id", selected.Id);            StartActivityForResult(intent, 0);        }        protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)        {            base.OnActivityResult(requestCode, resultCode, data);            // 当列表项发生变化时,这里仅关心如何刷新它,并没有处理选定的项            PopulateList();        }    }}
OK,这一章就讲到这了。

转载于:https://www.cnblogs.com/rainmj/p/5209599.html

你可能感兴趣的文章
直播视频流技术名词
查看>>
网易跟贴这么火,背后的某个力量不可忽视
查看>>
企业级java springboot b2bc商城系统开源源码二次开发-hystrix参数详解(八)
查看>>
java B2B2C 多租户电子商城系统- 整合企业架构的技术点
查看>>
IOC —— AOP
查看>>
比特币现金将出新招,推动比特币现金使用
查看>>
数据库的这些性能优化,你做了吗?
查看>>
某大型网站迁移总结(完结)
查看>>
mysql的innodb中事务日志(redo log)ib_logfile
查看>>
部署SSL证书后,网页内容造成页面错误提示的处理办法
查看>>
MS SQLSERVER通用存储过程分页
查看>>
60.使用Azure AI 自定义视觉服务实现物品识别Demo
查看>>
Oracle 冷备份
查看>>
jq漂亮实用的select,select选中后,显示对应内容
查看>>
C 函数sscanf()的用法
查看>>
python模块之hashlib: md5和sha算法
查看>>
linux系统安装的引导镜像制作流程分享
查看>>
解决ros建***能登录不能访问内网远程桌面的问题
查看>>
pfsense锁住自己
查看>>
vsftpd 相关总结
查看>>