在活动之间共享数据(字符串),保存并将其添加到ListView C#Xamarin

在活动之间共享数据(字符串),保存并将其添加到ListView C#Xamarin,c#,android,listview,xamarin,sharedpreferences,C#,Android,Listview,Xamarin,Sharedpreferences,首先,我必须提到,我是Android应用程序开发的新手。我正在使用Xamarin(C#)开发应用程序。问题出在这里。我想编写一个简单的ToDoList应用程序来学习如何在活动之间存储/共享数据 “添加”按钮位于主布局中。当用户单击它时,会显示另一个屏幕,用户可以在其中命名(EditText)任务并添加其说明(EditText)。当用户点击屏幕上的“完成”按钮时,应用程序会将用户重定向到主屏幕,并将用户的任务添加到列表视图中 我做了一些研究,发现我可以通过SharedReference、将数据保存

首先,我必须提到,我是Android应用程序开发的新手。我正在使用Xamarin(C#)开发应用程序。问题出在这里。我想编写一个简单的ToDoList应用程序来学习如何在活动之间存储/共享数据

“添加”按钮位于主布局中。当用户单击它时,会显示另一个屏幕,用户可以在其中命名(EditText)任务并添加其说明(EditText)。当用户点击屏幕上的“完成”按钮时,应用程序会将用户重定向到主屏幕,并将用户的任务添加到列表视图中

我做了一些研究,发现我可以通过SharedReference、将数据保存到设备上的文件或sql来实现这一点

我决定选择共享参考资料。问题是,我找到的关于SharedPreferences的所有东西(相信我,我搜索了很多)都是用Java编写的,这并不是什么大问题,但从来没有人提到过使用共享首选项在不同活动之间共享数据。我的代码如下,我真的挣扎了一天,所以请帮助我

我的主要活动(其中按钮“添加”为):

公共类main活动:活动
{
按钮添加;
列表视图列表;
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
///集合布局
SetContentView(Resource.Layout.Main);
///定义变量、按钮、列表
add=findviewbyd(Resource.Id.add);
list=findviewbyd(Resource.Id.list);
///从secondActivity获取字符串
var prefs=Application.Context.getSharedReferences(“todolist”,FileCreationMode.Private);
var preference=prefs.GetString(“任务”,null);
///将字符串(首选项)添加到列表
List lista=新列表();
添加(首选项);
///“转换”列表到列表视图
ArrayAdapter=新的ArrayAdapter(这个,Resource.Layout.Main,lista);
list.Adapter=适配器;
添加。单击+=委派
{
StartActivity(新意图(此,类型(添加活动));
};     
}       
}
我的第二个屏幕(第二个活动):

公共类addActivity:Activity
{
///定义变量并创建列表
按钮完整;
编辑文本名称、描述;
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.add);
///变数
complete=findviewbyd(Resource.Id.complete);
name=findviewbyd(Resource.Id.name);
description=findviewbyd(Resource.Id.description);
///转换为字符串
字符串title=name.Text.ToString();
字符串内容=description.Text.ToString();
///将字符串传递给MainActivity
完成。单击+=委派
{
if(String.IsNullOrEmpty(title))
{
Toast.MakeText(这是“请输入任务名称”,ToastLength.Short).Show();
}
其他的
{
var prefs=Application.Context.getSharedReferences(“todolist”,FileCreationMode.Private);
var prefEditor=prefs.Edit();
PutString(“任务”,标题);
提交();
Toast.MakeText(此“任务已添加”,ToastLength.Short).Show();
StartActivity(新意图(本,类型(主要活动));
}
};
}
}

您可以通过
意图将字符串传递到下一个活动

您不应该在开始活动的参数中定义该意图,而应该在此之前定义它,然后使用
putExtra
方法添加字符串


示例:

您可以在此处使用SQLite数据库。如果您想建立待办事项列表,我建议您这样做。这也会让你更容易

Xamarin提供了大量关于如何在此处设置的文档:

他们还提供了一个示例应用程序,可以实现您在这里想要做的事情:


问题是我想保存数据(任务/字符串)。我在某个地方读到,Intent只发送字符串,它不会为用户下次打开应用程序存储字符串。如果我错了,请纠正我。有很多方法可以保存这样的数据。android网站在这里概述了一些:如果提供的信息回答了您的问题,请将我的答案标记为正确。我已经反复阅读了好几遍,但我找不到在C#中实现共享首选项/内部存储/外部存储的示例。所以,如果您知道如何使用C#中的共享首选项来完成我的要求,我会将您的答案标记为正确。我知道你想说什么,但我不知道如何在C#中使用它。提前谢谢。
    public class MainActivity : Activity
{
    Button add;
    ListView list;

    protected override void OnCreate(Bundle bundle)
    {


        base.OnCreate(bundle); 

        ///set layout
        SetContentView(Resource.Layout.Main);

        ///define variables, buttons, lists
        add = FindViewById<Button>(Resource.Id.add);
        list = FindViewById<ListView>(Resource.Id.list);

        ///get string from secondActivity
        var prefs = Application.Context.GetSharedPreferences("todolist", FileCreationMode.Private);
        var preference = prefs.GetString("task", null);

        ///add string (preference) to list
        List<string> lista = new List<string>();
        lista.Add(preference);

        ///"convert" list to listview
        ArrayAdapter<string> adapter = new ArrayAdapter<string>(this, Resource.Layout.Main, lista);
        list.Adapter = adapter;

        add.Click += delegate
        {
            StartActivity(new Intent(this, typeof(addActivity)));
        };     



    }       

}
    public class addActivity : Activity
{

    /// define variables and create list
    Button complete;
    EditText name, description;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.add);

        ///variables
        complete = FindViewById<Button>(Resource.Id.complete);
        name = FindViewById<EditText>(Resource.Id.name);
        description = FindViewById<EditText>(Resource.Id.description);

        ///converting to string
        string title = name.Text.ToString();
        string content = description.Text.ToString();

        ///pass string to MainActivity
        complete.Click += delegate
        {
            if (String.IsNullOrEmpty(title))
            {
                Toast.MakeText(this, "Please enter task name", ToastLength.Short).Show();
            }
            else
            {
                var prefs = Application.Context.GetSharedPreferences("todolist", FileCreationMode.Private);
                var prefEditor = prefs.Edit();
                prefEditor.PutString("task", title);
                prefEditor.Commit();
                Toast.MakeText(this, "Task added", ToastLength.Short).Show();
                StartActivity(new Intent(this, typeof(MainActivity)));

            }
        };


    }

}