如何将多个用户输入保存到微调器?

Posted

技术标签:

【中文标题】如何将多个用户输入保存到微调器?【英文标题】:How can I save multiple user input to a spinner? 【发布时间】:2017-03-11 14:33:25 【问题描述】:

我正在使用 C# 在 Xamarin、Visual Studio 2015 上开发 android 应用程序。我有一个框,用户必须在其中输入字符串值,然后当单击按钮时,我希望将此值添加到微调器并保存并重新加载以供下次打开,这样他就可以选择他输入的值而无需重新输入。到现在为止我没有问题,我的想法奏效了。但我正在苦苦挣扎的是:如果用户输入了一个值然后单击按钮,然后输入另一个值,则只有最后一个值被保存并显示在重新打开APP时的微调器。我想要的是:用户输入的每个值都需要保存并显示在微调器中。然后如果用户想删除他之前输入的值,一个删除项目的按钮。

这是我到目前为止所做的:

string user;
ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(this);
var items = new List<string>()  "1", "2", "3" ;
Button button4 = FindViewById<Button>(Resource.Id.button4);
Spinner spinner = FindViewById<Spinner>(Resource.Id.spinner1);
EditText input = FindViewById<EditText>(Resource.Id.input);
user = input.Text;
button4.Click += delegate
        
            user = input.Text;
            items.Add(user);
            ISharedPreferencesEditor editor = prefs.Edit();
            editor.PutString("try", user);
            editor.Apply();
        ;
user = prefs.GetString("try", "no");
items.Add(user);
var adapter3 = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleSpinnerItem, items);
spinner.Adapter = adapter3;

当我重新打开应用程序时,这些代码将用户输入添加并保存到微调器,但如果用户输入了两个值,则只保存最后一个值。我想要的是每个值都保存并显示在微调器中。 提前谢谢你..

【问题讨论】:

您只是将最近的值保存到首选项。如果要存储多个值,则需要将它们存储在数组或列表中并将它们序列化为首选项。 使用 putStringSet 将字符串集合存储在 SharedPrefence 中,然后使用 getStringSet 填充微调器。 【参考方案1】:

试试这个:

    // a constant to avoid magic strings
    const string KEY_FOR_TRY = "TRY";

    ArrayAdapter<string> _spinnerAdapter;

    protected override void OnCreate (Bundle savedInstanceState)
    
        base.OnCreate (savedInstanceState);

        // Set our view from the "main" layout resource
        SetContentView (Resource.Layout.Main);

        string user;
        ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences (this);

        // Load the items from pref and fill the spinner
        // if pref is empty just set an empty list.
        // GetStringSet because you are loading the collection you saved.
        var savedItems = prefs.GetStringSet (KEY_FOR_TRY, new List<string> ());

        var items = new List<string> (savedItems);

        Button button4 = FindViewById<Button> (Resource.Id.button4);
        Spinner spinner = FindViewById<Spinner> (Resource.Id.spinner1);
        EditText input = FindViewById<EditText> (Resource.Id.input);
        user = input.Text;

        button4.Click += delegate
                
                    //you might want validate for empty strings and if entry is already saved to prevent duplicates.
                    user = input.Text;
                    items.Add (user);
                    ISharedPreferencesEditor editor = prefs.Edit ();

                    //PutStringSet because you are saving a collection.
                    editor.PutStringSet (KEY_FOR_TRY, items);
                    editor.Apply ();
                     //do this only if you want to refresh the spinner values.
                    _spinnerAdapter.Insert (user, 0);
                    _spinnerAdapter.NotifyDataSetChanged ();
                ;

        //Get the first item if there is any, don't know why you need this.
        user = items.FirstOrDefault ();

        _spinnerAdapter = new ArrayAdapter<string> (this, Android.Resource.Layout.SimpleSpinnerItem, items);

        spinner.Adapter = _spinnerAdapter;
    


希望这会有所帮助!

【讨论】:

这很好,但我希望我的微调器包含 (1,2,3) 作为默认值,然后如果用户想要添加另一个值,他可以这样做.. 正如我在代码中显示的那样: var items 包含“1,2,3”,它被设置为我的微调器的适配器。另外,你的代码中_spinneradapter.Insert(user, 0) 和_spinneradapter.NotifyDataSetChanged() 的含义我没看懂。 如果用户想要删除他输入的值之一,我还想要一个按钮来删除项目。另外我不希望用户输入两个相同的值或输入一个空值。 @apineda

以上是关于如何将多个用户输入保存到微调器?的主要内容,如果未能解决你的问题,请参考以下文章

您如何存储用户输入数据中的值?

从微调器创建计算器

如何获得30秒的多个用户输入并将其保存到列表中?

退出时如何保存 Activity 的状态?安卓

如何更改各种微调器值的 EditText 字段

将图像保存到库时不显示 HUD 微调器