Android利用Intent实现记事本功能(NotePad)

本文实例为大家分享了Intent如何实现一个简单的记事本功能的演示过程,供大家参考,具体内容如下

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文件

<?xml version="1.0" encoding="utf-8"?> <view xmlns:android="http://schemas.android.com/apk/res/android" class="MyDemos.SrcDemos.ch1205LinedEditText" android:id="@+id/note" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="5dip" android:scrollbars="vertical" android:fadingEdge="vertical" android:gravity="top" android:textSize="22sp" android:capitalize="sentences" />

(4)添加ch1205_Main.axml文件

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="#ffffff" android:padding="10px"> <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ch12_app_notes" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingTop="6px"> <TextView android:id="@+id/body" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/modified" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>

(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<ch1205Note> 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<TextView>(Resource.Id.body).Text = Left(item.Body.Replace("\n", " "), 25); view.FindViewById<TextView>(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<EditText>(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(); } } }

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

时间: 2024-09-03 06:00:58

Android利用Intent实现记事本功能(NotePad)的相关文章

Android利用Intent实现记事本功能(NotePad)_Android

本文实例为大家分享了Intent如何实现一个简单的记事本功能的演示过程,供大家参考,具体内容如下 1.运行截图 单击右上角[-]会弹出[添加]菜单项,长按某条记录会弹出快捷菜单[删除]项. 2.主要设计步骤 (1)添加引用 鼠标右击[引用]à[添加引用],在弹出的窗口中勾选"System.Data"和"System.Data.SQlite",如下图所示: 注意:不需要通过NuGet添加SQLite程序包,只需要按这种方式添加即可. (2)添加图片 到Android

Android利用GridView实现单选功能

先看看GridView实现单选效果 如果是你需要的,你可以继续往下看了 实现起来比较简单,直接上代码 主Activity的布局,一个Button用来跳转到筛选Activity一个TextView用来显示筛选后的到的结果 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/androi

Android利用CountDownTimer实现倒计时功能 Android实现停留5s跳转到登录页面

利用CountDownTimer实现倒计时,停留5s跳转到登录页面功能,具体如下 举个栗子,引导页面最后一个界面要停留5s跳转到登录页面.代码如下: //假设 这是引导页面最后一个界面 public class MainActivity extends Activity { private TextView count_time; private MyCountDownTimer myCountDownTimer; @Override protected void onCreate(Bundle

Android利用Intent读取和更新通讯录

一.简介 本节演示如何在安卓系统中通过用户配置文件(user profile)读取和更新该手机的所有联系人信息,以及如何导航到用户配置文件中的这些联系人. 二.基本概念  1.什么是 User Profile 用户配置文件(user profile)保存的是机主信息以及该手机中所有联系人的信息. 假定手机所有者的名字为"Mao mao yu",那么,user profile保存的就是"Mao mao yu"的通讯录(即机主所有联系人的姓名.电话.邮箱.--等信息).

Android利用Intent启动和关闭Activity_Android

一.简介 Android应用程序中一般都有多个Activity,在Activity中,通过调用StartActivity方法,并在该方法的参数中传递Intent对象,就可以实现不同Activity之间的切换和数据传递. 通过StartActivity方法传递intent对象来启动另一个Activity时,可分为两类: l 显式启动:在创建的Intent对象中明确指定启动的是哪个Activity: l 隐式启动:安卓系统根据Intent的动作和数据决定应该启动哪个Activity. 1.显式启动A

Android利用Chronometer实现倒计时功能_Android

项目需要实现一个计时的功能,利用Chronometer虽然可以很方便的实现计时功能,但需要的却是一个倒计时控件. 百度了一下方法不少,倒计时的却没有,于是用Chronometer封装了一个倒计时的类,本着开源的精神,分享给大家! 废话不说了,进入主题 首先xml布局如下: <com.example.anticlockwisedemo.Anticlockwise android:id="@+id/id_timer" android:layout_width="wrap_c

Android利用Intent实现读取图片操作_Android

本文实例演示如何从图库(Gallery)中读取图像并用ImageView将它显示出来,供大家参考,具体内容如下 运行本示例前,需要先利用相机模拟拍摄一些图片到图库中. 1.运行截图    2.主要设计步骤 (1)添加ch1203_ReadGallery.axml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.androi

Android利用Chronometer实现倒计时功能

项目需要实现一个计时的功能,利用Chronometer虽然可以很方便的实现计时功能,但需要的却是一个倒计时控件. 百度了一下方法不少,倒计时的却没有,于是用Chronometer封装了一个倒计时的类,本着开源的精神,分享给大家! 废话不说了,进入主题 首先xml布局如下: <com.example.anticlockwisedemo.Anticlockwise android:id="@+id/id_timer" android:layout_width="wrap_c

Android利用Intent启动和关闭Activity

一.简介 Android应用程序中一般都有多个Activity,在Activity中,通过调用StartActivity方法,并在该方法的参数中传递Intent对象,就可以实现不同Activity之间的切换和数据传递. 通过StartActivity方法传递intent对象来启动另一个Activity时,可分为两类: l 显式启动:在创建的Intent对象中明确指定启动的是哪个Activity: l 隐式启动:安卓系统根据Intent的动作和数据决定应该启动哪个Activity. 1.显式启动A