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

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

1、运行截图

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

81429c94acc0f05f696cb2cb87fbe1a9.png

2、主要设计步骤

(1)添加引用

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

ade3bc38ced9fedeaac1f84ddf9529a8.png

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

(2)添加图片

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

(3)添加ch1205_NoteEditor.axml文件

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

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:orientation="horizontal"

android:background="#ffffff"

android:padding="10px">

android:id="@+id/icon"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/ch12_app_notes" />

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:orientation="vertical"

android:paddingTop="6px">

android:id="@+id/body"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

android:id="@+id/modified"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

(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();

}

}

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值