2011-05-09 56 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