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