2011-05-09 57 views
0

在我的android应用程序我有一个按钮,它将新的动态微调添加到布局。所有创建的Spinners都使用相同的Array。动态微调和共享首选

什么工作到现在为止,我可以保存创建的Spinners的数量,并在重新启动应用程序后重新创建它们。 但我真的想将每个微调器的selectedPosition保存在sharedPreferences中,这就是我在ForceClose Desaster中的位置...

在我的理解中,每个微调器在创建时都会获得一个ID,以便您可以保存该位置在首选项中以此ID为界。

所以这是我做过什么:

public void addSpinner(){ 

    LinearLayout AddLayout = (LinearLayout)findViewById(R.id.linearAddScroll); 
    spinner = new Spinner(this); 
    ArrayAdapter<?> adapt = ArrayAdapter.createFromResource(this, 
      R.array.Filter, android.R.layout.simple_spinner_item); 
    adapt.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner.setAdapter(adapt); 
    AddLayout.addView(spinner); 
    } 

这创造了微调。

public void onClick(View v) { 
      addSpinner(); 


      int ID = 1000+x; 
      spinner.setId(ID); 
      Toast.makeText(MatReporterActivity.this,"ID" + ID, 5) 
      .show(); 
      x++; 
     } 

设置ID。

这是我在上创建方法做:

x = settings.getInt("xsave", 1); 
    for(y = 1; y < x; y++){ 
     addSpinner(); 

     int ID = 1000+y; 
     Spinner s = (Spinner) findViewById(ID); 

     String ys= Integer.toString(ID); 
     Toast.makeText(MatReporterActivity.this,"ID" +ys, 5) 
     .show(); 
     int yf = settings.getInt(ys, 1); 
     s.setSelection(yf); 
     } 

这的onStop():

SharedPreferences settings = PreferenceManager 
      .getDefaultSharedPreferences(this); 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putInt("xsave", x); 
    for(y = 1; y < x; y++){ 
     int ID = 1000+y; 
     Spinner s2= (Spinner) findViewById(ID); 
     int possS = s2.getSelectedItemPosition(); 
     Toast.makeText(MatReporterActivity.this, "IDStop" + ID, 5) 
     .show(); 
     String ys= Integer.toString(ID); 
     editor.putInt(ys, possS); 
    } 

    editor.commit(); 
} 

我认为这是在onCreate方法的逻辑问题,但我我无法找到它,也没有在网上找到任何帮助,如何填充和保存动态创建的spinners。

所以,也许有人有一个想法。 谢谢。

+0

您的部队的堆栈跟踪关闭?你使用LogCat(如果没有,你应该)。 – Klaus 2011-05-09 11:54:06

回答

0

SharedPreferences不是存储此类数据的好方法。你应该尽量遵循这些2步:

创建其实现Serializable表示要存储的数据的类(你可以使用序列化对象的列表)

public class SpinnerSave implements Serializable { 
    public String ID; 
    public int selection; 

    public SpinnerSave(String ID, int selection){ 
    this.ID = ID; 
    this.selection = selection; 
    } 
} 

那么你应该写你的数据到像这样的文件

private void saveState() { 
final File cache_dir = this.getCacheDir(); 
final File suspend_f = new File(cache_dir.getAbsoluteFile() + File.separator + SUSPEND_FILE); 

FileOutputStream fos = null; 
ObjectOutputStream oos = null; 
boolean   keep = true; 

try { 
    fos = new FileOutputStream(suspend_f); 
    oos = new ObjectOutputStream(fos); 

    oos.writeObject(this.gameState); 
} 
catch (Exception e) { 
    keep = false; 
    Log.e("MyAppName", "failed to suspend", e); 
} 
finally { 
    try { 
     if (oos != null) oos.close(); 
     if (fos != null) fos.close(); 
     if (keep == false) suspend_f.delete(); 
    } 
    catch (Exception e) { /* do nothing */ } 
} 
} 
+0

好吧我理解或多或少你的答案(我是一个血腥的初学者:)),但因为我有一个数据库已经在我的应用程序,我宁愿将它存储在那里。事情是,我真的不知道如何为不断变化的Spinners提供正确的位置 – paulina 2011-05-09 19:02:48

+0

您是否试图用Spinner ID保存一个HashMap作为关键字并将其作为值的位置? – Kirualex 2011-05-09 19:19:16

+0

以前从来没有听说过这个,但据我看来这听起来很有趣。这个hashmaps是否能在应用程序的杀死过程中存活,还是需要以某种方式保存它们。 – paulina 2011-05-09 20:40:28