如何在以前的用户输入仍然存在的情况下打开 activity Xamarin
How to open an activity with previous user input still there Xamarin
我正在制作一个提醒应用程序,我希望用户能够添加提醒,然后稍后再进行编辑。
目前当用户选择编辑提醒时,所有字段的开头都是空白的。像这样:
https://i.stack.imgur.com/WCwja.gif
不过我希望它是这样的:
这是我的部分代码:
namespace ReminderApp.Models
{
public class Reminder
{
public int Id { get; set; }
public string Date { get; set; }
public string Time { get; set; }
public string Note { get; set; }
public Reminder()
{
}
}
}
我的数据库:
using Android.Content;
using Android.Database.Sqlite;
namespace ReminderApp.HelperRepository
{
public class DataStore : SQLiteOpenHelper
{
private static string _DatabaseName = "reminderDB.db";
public DataStore(Context context) : base(context, _DatabaseName, null, 1)
{
}
public override void OnCreate(SQLiteDatabase db)
{
db.ExecSQL(ReminderHelper.CreateQuery);
}
public override void OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.ExecSQL(ReminderHelper.DeleteQuery);
OnCreate(db);
}
}
}
我的数据库助手删除、更新和添加提醒:
using System;
using System.Collections.Generic;
using Android.Content;
using Android.Database.Sqlite;
using ReminderApp.Models;
using Android.Database;
namespace ReminderApp.HelperRepository
{
public class ReminderHelper
{
private const string TableName = "reminderTable";
private const string ColumnID = "Id";
private const string ColumnDate = "Date";
private const string ColumnTime = "Time";
private const string ColumnNote = "Note";
public const string CreateQuery = "CREATE TABLE " + TableName + " ( "
+ ColumnID + " INTEGER PRIMARY KEY,"
+ ColumnDate + " TEXT,"
+ ColumnTime + " TEXT,"
+ ColumnNote + " TEXT)";
public const string DeleteQuery = "DROP TABLE IF EXISTS " + TableName;
public ReminderHelper()
{
}
public static void InsertReminderData(Context context, Reminder reminder)
{
SQLiteDatabase db = new DataStore(context).WritableDatabase;
ContentValues contentValues = new ContentValues();
contentValues.Put(ColumnDate, reminder.Date);
contentValues.Put(ColumnTime, reminder.Time);
contentValues.Put(ColumnNote, reminder.Note);
db.Insert(TableName, null, contentValues);
db.Close();
}
public static void EditReminderData(Context context, Reminder reminder)
{
SQLiteDatabase db = new DataStore(context).WritableDatabase;
ContentValues contentValues = new ContentValues();
contentValues.Put(ColumnDate, reminder.Date);
contentValues.Put(ColumnTime, reminder.Time);
contentValues.Put(ColumnNote, reminder.Note);
db.Update(TableName, contentValues, null, null);
db.Close();
}
public static List<Reminder> GetReminderList(Context context)
{
List<Reminder> reminder = new List<Reminder>();
SQLiteDatabase db = new DataStore(context).ReadableDatabase;
string[] columns = new string[] { ColumnID, ColumnDate, ColumnTime, ColumnNote };
using (ICursor cursor = db.Query(TableName, columns, null, null, null, null, null))
{
while (cursor.MoveToNext())
{
reminder.Add(new Reminder
{
Id = cursor.GetInt(cursor.GetColumnIndexOrThrow(ColumnID)),
Date = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnDate)),
Time = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnTime)),
Note = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnNote))
});
}
}
db.Close();
return reminder;
}
public static void DeleteReminder(Context context, Reminder reminder)
{
SQLiteDatabase db = new DataStore(context).WritableDatabase;
db.Delete(TableName, ColumnDate + "=? AND " + ColumnTime + "=? OR " + ColumnID + "=" + reminder.Id, new string[] { reminder.Date, reminder.Time });
db.Close();
}
public static Reminder SelectReminder(Context context)
{
Reminder reminder;
SQLiteDatabase db = new DataStore(context).WritableDatabase;
string[] columns = new string[] { ColumnID, ColumnDate, ColumnTime, ColumnNote };
string datetime = DateTime.Now.ToString();
string[] dt = datetime.Split(' ');
var date = dt[0];
var tt = dt[1].Split(':');
var time = tt[0] + ":" + tt[1] + " " + dt[2];
using (ICursor cursor = db.Query(TableName, columns, ColumnDate + "=? AND " + ColumnTime + "=?", new string[] { date, time }, null, null, null))
{
if (cursor.MoveToNext())
{
reminder = new Reminder
{
Id = cursor.GetInt(cursor.GetColumnIndexOrThrow(ColumnID)),
Date = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnDate)),
Time = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnTime)),
Note = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnNote))
};
}
else
{
reminder = null;
}
}
return reminder;
}
}
}
和 activity 编辑提醒:
using System;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget;
using Newtonsoft.Json;
using ReminderApp.Models;
using ReminderApp.HelperRepository;
using System.Threading;
namespace ReminderApp
{
[Activity(Label = "EditActivity")]
public class EditActivity : Activity
{
public Reminder reminder;
EditText _dateDisplay;
EditText _timeDisplay;
EditText _txtNote;
Button _saveButton;
Button _btnList;
#region DateOperation
[Obsolete]
void DateSelect_OnClick(object sender, EventArgs eventArgs)
{
DatePickerFragment frag = DatePickerFragment.NewInstance(delegate (DateTime time)
{
_dateDisplay.Text = time.ToString().Split(' ')[0];
reminder.Date = _dateDisplay.Text + " ";
});
frag.Show(FragmentManager, DatePickerFragment.TAG);
}
#endregion
#region TimeOperation
[Obsolete]
void TimeSelectOnClick(object sender, EventArgs eventArgs)
{
TimePickerFragment frag = TimePickerFragment.NewInstance(
delegate (DateTime time)
{
_timeDisplay.Text = time.ToShortTimeString();
reminder.Time = _timeDisplay.Text + " ";
});
frag.Show(FragmentManager, TimePickerFragment.TAG);
}
#endregion
#region SaveDetails
void SaveRecords(object sender, EventArgs eventArgs)
{
reminder.Note = _txtNote.Text;
if (Vaidate())
{
DateTime currentDT = DateTime.Now;
DateTime selectedDT = Convert.ToDateTime(reminder.Date + " " + reminder.Time);
if (selectedDT > currentDT)
{
ReminderHelper.EditReminderData(this, reminder);
var reminderEdited = new Intent(this, typeof(ReminderEdited));
reminderEdited.PutExtra("reminder", JsonConvert.SerializeObject(reminder));
StartActivity(reminderEdited);
}
else
{
Toast.MakeText(this, "This is invalid selelction of Date, Time!", ToastLength.Short).Show();
}
}
}
bool Vaidate()
{
if (reminder.Date == string.Empty || reminder.Time == string.Empty || reminder.Note == string.Empty)
{
Toast.MakeText(this, "Enter the details of all fields!", ToastLength.Short).Show();
return false;
}
return true;
}
#endregion
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_edit);
reminder = new Reminder();
var id = Intent.GetIntExtra("Id", 0);
var note = Intent.GetStringExtra("Note");
var time = Intent.GetStringExtra("Time");
var date = Intent.GetStringExtra("Date");
if (id != 0)
reminder.Id = id;
reminder.Note = note;
reminder.Date = date;
reminder.Time = time;
_dateDisplay = FindViewById<EditText>(Resource.Id.date_display);
_timeDisplay = FindViewById<EditText>(Resource.Id.time_display);
_txtNote = FindViewById<EditText>(Resource.Id.txtNote);
_saveButton = FindViewById<Button>(Resource.Id.save);
_btnList = FindViewById<Button>(Resource.Id.btnList);
_dateDisplay.Click += DateSelect_OnClick;
_timeDisplay.Click += TimeSelectOnClick;
_saveButton.Click += SaveRecords;
_btnList.Click += (sender, e) => {
StartActivity(new Intent(this, typeof(ListReminder)));
};
}
}
}
当我尝试像这样放置 _dateDisplay = (EditText)reminder.Date
时:
我收到错误消息“对象引用未设置为对象的瞬间”
如何更改我的代码,以便当用户选择编辑提醒时,字段包含用户之前输入内容的详细信息。
如果您需要,这是我的完整申请:https://github.com/CrazyDanyal1414/ReminderApp
感谢任何帮助!
我在我这边测试了你的代码,问题是数据没有从存储中正确获取。您已将 Intent
的数据发送到 EditActivity
class:
public class ListReminder : Activity
{
...
private void List_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
...
alert.SetButton2("Edit", (c, ev) =>
{
var intent = new Intent(this, typeof(EditActivity));
intent.PutExtra("Id", listitem[e.Position].Id);
StartActivity(intent);
});
}
}
可以在EditActivity中获取idclass,然后尝试从Helper中获取对应的数据模型class.Check代码:
public class EditActivity : Activity
{
...
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_edit);
reminder = new Reminder();
var id = Intent.GetIntExtra("Id", 0);
var array = ReminderHelper.GetReminderList(this).ToArray();
var data = array[id - 1] as Reminder;
_dateDisplay = FindViewById<EditText>(Resource.Id.date_display);
_timeDisplay = FindViewById<EditText>(Resource.Id.time_display);
_txtNote = FindViewById<EditText>(Resource.Id.txtNote);
_dateDisplay.Text = data.Note;
_timeDisplay.Text = data.Time;
_txtNote.Text = data.Date;
_...
}
}
在ReminderHelper中创建方法,通过Id获取提醒对象
ReminderHelper.cs
public static Reminder SelectReminder(Context context, int reminderId)
{
Reminder reminder;
SQLiteDatabase db = new DataStore(context).ReadableDatabase;
string[] columns = new string[] { ColumnID, ColumnDate, ColumnTime, ColumnNote };
using (ICursor cursor = db.Query(TableName, columns, ColumnID + "=" + reminderId, null, null, null, null))
{
if (cursor.MoveToNext())
{
reminder = new Reminder
{
Id = cursor.GetInt(cursor.GetColumnIndexOrThrow(ColumnID)),
Date = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnDate)),
Time = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnTime)),
Note = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnNote))
};
}
else
{
reminder = null;
}
}
return reminder;
}
然后在EditRemider中使用上述方法获取提醒对象
EditReminder.cs
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_main);
var id = Intent.GetIntExtra("Id", 0);
if (id != 0)
{
reminder = ReminderHelper.SelectReminder(this, id);
}
if (reminder == null)
reminder = new Reminder();
_dateDisplay = FindViewById<EditText>(Resource.Id.date_display);
_timeDisplay = FindViewById<EditText>(Resource.Id.time_display);
_txtNote = FindViewById<EditText>(Resource.Id.txtNote);
_dateDisplay.Text = reminder.Date;
_timeDisplay.Text = reminder.Time;
_txtNote.Text = reminder.Note;
_saveButton = FindViewById<Button>(Resource.Id.save);
_btnList = FindViewById<Button>(Resource.Id.btnList);
_dateDisplay.Click += DateSelect_OnClick;
_timeDisplay.Click += TimeSelectOnClick;
_saveButton.Click += SaveRecords;
_btnList.Click += (sender, e) => {
StartActivity(new Intent(this, typeof(ListReminder)));
};
}
我正在制作一个提醒应用程序,我希望用户能够添加提醒,然后稍后再进行编辑。
目前当用户选择编辑提醒时,所有字段的开头都是空白的。像这样:
https://i.stack.imgur.com/WCwja.gif
不过我希望它是这样的:
这是我的部分代码:
namespace ReminderApp.Models
{
public class Reminder
{
public int Id { get; set; }
public string Date { get; set; }
public string Time { get; set; }
public string Note { get; set; }
public Reminder()
{
}
}
}
我的数据库:
using Android.Content;
using Android.Database.Sqlite;
namespace ReminderApp.HelperRepository
{
public class DataStore : SQLiteOpenHelper
{
private static string _DatabaseName = "reminderDB.db";
public DataStore(Context context) : base(context, _DatabaseName, null, 1)
{
}
public override void OnCreate(SQLiteDatabase db)
{
db.ExecSQL(ReminderHelper.CreateQuery);
}
public override void OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.ExecSQL(ReminderHelper.DeleteQuery);
OnCreate(db);
}
}
}
我的数据库助手删除、更新和添加提醒:
using System;
using System.Collections.Generic;
using Android.Content;
using Android.Database.Sqlite;
using ReminderApp.Models;
using Android.Database;
namespace ReminderApp.HelperRepository
{
public class ReminderHelper
{
private const string TableName = "reminderTable";
private const string ColumnID = "Id";
private const string ColumnDate = "Date";
private const string ColumnTime = "Time";
private const string ColumnNote = "Note";
public const string CreateQuery = "CREATE TABLE " + TableName + " ( "
+ ColumnID + " INTEGER PRIMARY KEY,"
+ ColumnDate + " TEXT,"
+ ColumnTime + " TEXT,"
+ ColumnNote + " TEXT)";
public const string DeleteQuery = "DROP TABLE IF EXISTS " + TableName;
public ReminderHelper()
{
}
public static void InsertReminderData(Context context, Reminder reminder)
{
SQLiteDatabase db = new DataStore(context).WritableDatabase;
ContentValues contentValues = new ContentValues();
contentValues.Put(ColumnDate, reminder.Date);
contentValues.Put(ColumnTime, reminder.Time);
contentValues.Put(ColumnNote, reminder.Note);
db.Insert(TableName, null, contentValues);
db.Close();
}
public static void EditReminderData(Context context, Reminder reminder)
{
SQLiteDatabase db = new DataStore(context).WritableDatabase;
ContentValues contentValues = new ContentValues();
contentValues.Put(ColumnDate, reminder.Date);
contentValues.Put(ColumnTime, reminder.Time);
contentValues.Put(ColumnNote, reminder.Note);
db.Update(TableName, contentValues, null, null);
db.Close();
}
public static List<Reminder> GetReminderList(Context context)
{
List<Reminder> reminder = new List<Reminder>();
SQLiteDatabase db = new DataStore(context).ReadableDatabase;
string[] columns = new string[] { ColumnID, ColumnDate, ColumnTime, ColumnNote };
using (ICursor cursor = db.Query(TableName, columns, null, null, null, null, null))
{
while (cursor.MoveToNext())
{
reminder.Add(new Reminder
{
Id = cursor.GetInt(cursor.GetColumnIndexOrThrow(ColumnID)),
Date = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnDate)),
Time = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnTime)),
Note = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnNote))
});
}
}
db.Close();
return reminder;
}
public static void DeleteReminder(Context context, Reminder reminder)
{
SQLiteDatabase db = new DataStore(context).WritableDatabase;
db.Delete(TableName, ColumnDate + "=? AND " + ColumnTime + "=? OR " + ColumnID + "=" + reminder.Id, new string[] { reminder.Date, reminder.Time });
db.Close();
}
public static Reminder SelectReminder(Context context)
{
Reminder reminder;
SQLiteDatabase db = new DataStore(context).WritableDatabase;
string[] columns = new string[] { ColumnID, ColumnDate, ColumnTime, ColumnNote };
string datetime = DateTime.Now.ToString();
string[] dt = datetime.Split(' ');
var date = dt[0];
var tt = dt[1].Split(':');
var time = tt[0] + ":" + tt[1] + " " + dt[2];
using (ICursor cursor = db.Query(TableName, columns, ColumnDate + "=? AND " + ColumnTime + "=?", new string[] { date, time }, null, null, null))
{
if (cursor.MoveToNext())
{
reminder = new Reminder
{
Id = cursor.GetInt(cursor.GetColumnIndexOrThrow(ColumnID)),
Date = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnDate)),
Time = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnTime)),
Note = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnNote))
};
}
else
{
reminder = null;
}
}
return reminder;
}
}
}
和 activity 编辑提醒:
using System;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget;
using Newtonsoft.Json;
using ReminderApp.Models;
using ReminderApp.HelperRepository;
using System.Threading;
namespace ReminderApp
{
[Activity(Label = "EditActivity")]
public class EditActivity : Activity
{
public Reminder reminder;
EditText _dateDisplay;
EditText _timeDisplay;
EditText _txtNote;
Button _saveButton;
Button _btnList;
#region DateOperation
[Obsolete]
void DateSelect_OnClick(object sender, EventArgs eventArgs)
{
DatePickerFragment frag = DatePickerFragment.NewInstance(delegate (DateTime time)
{
_dateDisplay.Text = time.ToString().Split(' ')[0];
reminder.Date = _dateDisplay.Text + " ";
});
frag.Show(FragmentManager, DatePickerFragment.TAG);
}
#endregion
#region TimeOperation
[Obsolete]
void TimeSelectOnClick(object sender, EventArgs eventArgs)
{
TimePickerFragment frag = TimePickerFragment.NewInstance(
delegate (DateTime time)
{
_timeDisplay.Text = time.ToShortTimeString();
reminder.Time = _timeDisplay.Text + " ";
});
frag.Show(FragmentManager, TimePickerFragment.TAG);
}
#endregion
#region SaveDetails
void SaveRecords(object sender, EventArgs eventArgs)
{
reminder.Note = _txtNote.Text;
if (Vaidate())
{
DateTime currentDT = DateTime.Now;
DateTime selectedDT = Convert.ToDateTime(reminder.Date + " " + reminder.Time);
if (selectedDT > currentDT)
{
ReminderHelper.EditReminderData(this, reminder);
var reminderEdited = new Intent(this, typeof(ReminderEdited));
reminderEdited.PutExtra("reminder", JsonConvert.SerializeObject(reminder));
StartActivity(reminderEdited);
}
else
{
Toast.MakeText(this, "This is invalid selelction of Date, Time!", ToastLength.Short).Show();
}
}
}
bool Vaidate()
{
if (reminder.Date == string.Empty || reminder.Time == string.Empty || reminder.Note == string.Empty)
{
Toast.MakeText(this, "Enter the details of all fields!", ToastLength.Short).Show();
return false;
}
return true;
}
#endregion
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_edit);
reminder = new Reminder();
var id = Intent.GetIntExtra("Id", 0);
var note = Intent.GetStringExtra("Note");
var time = Intent.GetStringExtra("Time");
var date = Intent.GetStringExtra("Date");
if (id != 0)
reminder.Id = id;
reminder.Note = note;
reminder.Date = date;
reminder.Time = time;
_dateDisplay = FindViewById<EditText>(Resource.Id.date_display);
_timeDisplay = FindViewById<EditText>(Resource.Id.time_display);
_txtNote = FindViewById<EditText>(Resource.Id.txtNote);
_saveButton = FindViewById<Button>(Resource.Id.save);
_btnList = FindViewById<Button>(Resource.Id.btnList);
_dateDisplay.Click += DateSelect_OnClick;
_timeDisplay.Click += TimeSelectOnClick;
_saveButton.Click += SaveRecords;
_btnList.Click += (sender, e) => {
StartActivity(new Intent(this, typeof(ListReminder)));
};
}
}
}
当我尝试像这样放置 _dateDisplay = (EditText)reminder.Date
时:
我收到错误消息“对象引用未设置为对象的瞬间”
如何更改我的代码,以便当用户选择编辑提醒时,字段包含用户之前输入内容的详细信息。
如果您需要,这是我的完整申请:https://github.com/CrazyDanyal1414/ReminderApp
感谢任何帮助!
我在我这边测试了你的代码,问题是数据没有从存储中正确获取。您已将 Intent
的数据发送到 EditActivity
class:
public class ListReminder : Activity
{
...
private void List_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
...
alert.SetButton2("Edit", (c, ev) =>
{
var intent = new Intent(this, typeof(EditActivity));
intent.PutExtra("Id", listitem[e.Position].Id);
StartActivity(intent);
});
}
}
可以在EditActivity中获取idclass,然后尝试从Helper中获取对应的数据模型class.Check代码:
public class EditActivity : Activity
{
...
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_edit);
reminder = new Reminder();
var id = Intent.GetIntExtra("Id", 0);
var array = ReminderHelper.GetReminderList(this).ToArray();
var data = array[id - 1] as Reminder;
_dateDisplay = FindViewById<EditText>(Resource.Id.date_display);
_timeDisplay = FindViewById<EditText>(Resource.Id.time_display);
_txtNote = FindViewById<EditText>(Resource.Id.txtNote);
_dateDisplay.Text = data.Note;
_timeDisplay.Text = data.Time;
_txtNote.Text = data.Date;
_...
}
}
在ReminderHelper中创建方法,通过Id获取提醒对象
ReminderHelper.cs
public static Reminder SelectReminder(Context context, int reminderId)
{
Reminder reminder;
SQLiteDatabase db = new DataStore(context).ReadableDatabase;
string[] columns = new string[] { ColumnID, ColumnDate, ColumnTime, ColumnNote };
using (ICursor cursor = db.Query(TableName, columns, ColumnID + "=" + reminderId, null, null, null, null))
{
if (cursor.MoveToNext())
{
reminder = new Reminder
{
Id = cursor.GetInt(cursor.GetColumnIndexOrThrow(ColumnID)),
Date = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnDate)),
Time = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnTime)),
Note = cursor.GetString(cursor.GetColumnIndexOrThrow(ColumnNote))
};
}
else
{
reminder = null;
}
}
return reminder;
}
然后在EditRemider中使用上述方法获取提醒对象
EditReminder.cs
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_main);
var id = Intent.GetIntExtra("Id", 0);
if (id != 0)
{
reminder = ReminderHelper.SelectReminder(this, id);
}
if (reminder == null)
reminder = new Reminder();
_dateDisplay = FindViewById<EditText>(Resource.Id.date_display);
_timeDisplay = FindViewById<EditText>(Resource.Id.time_display);
_txtNote = FindViewById<EditText>(Resource.Id.txtNote);
_dateDisplay.Text = reminder.Date;
_timeDisplay.Text = reminder.Time;
_txtNote.Text = reminder.Note;
_saveButton = FindViewById<Button>(Resource.Id.save);
_btnList = FindViewById<Button>(Resource.Id.btnList);
_dateDisplay.Click += DateSelect_OnClick;
_timeDisplay.Click += TimeSelectOnClick;
_saveButton.Click += SaveRecords;
_btnList.Click += (sender, e) => {
StartActivity(new Intent(this, typeof(ListReminder)));
};
}