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

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

(0)

相关推荐

  • Android实现记事本功能(26)

    本文实例为大家分享了Android实现记事本功能的具体代码,供大家参考,具体内容如下 MainActivity.java代码: package siso.smartnotef.activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.

  • Android中实现记事本动态添加行效果

    本文主要给大家介绍了关于Android实现记事本动态添加行的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 先看效果图: 这是昨天在群里面有人在问这个问题,在这里顺便记录一下,这个效果我们可以自定义EditText,实现起来也不难 看详细步骤: 第一:初始化Paint,这里肯定要用到画笔的 this.paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setColor(getResources().getCo

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

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

  • Android利用Intent.ACTION_SEND进行分享

    安卓系统本身可以很简便的实现分享功能,因为我们只需向startActivity传递一个ACTION_SEND的Intent,系统就为我们弹出一个应用程序列表.其实在系统的文件管理器中,这应该是我们常用的功能(包括文件的打开Intent.ACTION_VIEW). 下面列出一个简单的分享方式 Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent

  • 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利用handler实现倒计时功能

    本文实例为大家分享了android利用handler实现倒计时的具体代码,供大家参考,具体内容如下 xml <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app=&qu

  • Android利用Sensor实现传感器功能

    本文实例为大家分享了Android利用Sensor实现传感器的具体代码,供大家参考,具体内容如下 一.传感器的使用 1.传感器的类型: 方向传感器::Sensor.TYPE_ORIENTATION 加速度(重力)传感器:sensor.TYPE_ACCELEFOMETER 光线传感器:sensor.TYPT_LIGHT 磁场传感器:sensor.TYPE_MANGNETIC_FIELD 距离(临近性)传感器:Sensor.TYPE_FROXIMITY 温度传感器:Sensor.TYPE_TEMPE

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

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

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

  • android利用service完成计时功能

    本文为大家分享了android service计时功能的具体代码,供大家参考,具体内容如下 源码下载地址:https://github.com/luoye123/Timing 1.首先建立主页面的设计:activity_time.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/r

随机推荐