• 【Android】12.6 利用Intent实现记事本功能(NotePad)


    分类:C#、Android、VS2015;

    创建日期:2016-02-23

    一、简介

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

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

    二、示例—ch1205NotePadDemo

    1、运行截图

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

    image

    2、主要设计步骤

    (1)添加引用

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

    image

    注意:不需要通过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("
    ", " "), 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();
            }
        }
    }
    OK,这一章就讲到这了。
  • 相关阅读:
    后台返回null iOS
    iOS代码规范
    没落的公司 该何去何从
    定位框一闪而过 iOS Swift
    根据appid跳到App Store某个APP的详情页
    Analyze 静态分析内存泄漏代码优化 instrument之Xcode
    bugly手动上传符号表和自动上传符号表
    __null_unspecified属性关键字解决内存泄漏
    栅栏函数dispatch_barrier_sync/async
    cell左滑加删除置顶功能 iOS
  • 原文地址:https://www.cnblogs.com/rainmj/p/5209599.html
Copyright © 2020-2023  润新知