2013-02-15 65 views
0

我正在創建應用程序,該應用程序應該執行以下操作:
- 啓動時會顯示splash/info-activity。
- 在接下來的活動顯示爲複選框的名稱列表
- 用戶可以通過EditText上添加新的名字&添加按鈕(列表動態更新)
- 當關閉應用程序,並重新打開,先前添加的名字應該被保存並顯示在列表中。
我試圖建立我的名單在我的startingactivity的ArrayList只是爲了看看我是否能保存和正確加載我的信息:Android,Save ArrayList用於重新打開應用程序

public class StartActivity extends Activity implements OnClickListener { 
Typeface face; 
TextView tvStartIntrotext; 
Button bStartStart; 

ArrayList<String> names = new ArrayList<String>(); 

String NAMESFILE = "names_file"; 
FileOutputStream fos; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.startactivity); 

    face = Typeface.createFromAsset(getAssets(), "andalemono.ttf"); 
    bStartStart = (Button) findViewById(R.id.bStartStart); 
    bStartStart.setTypeface(face); 
    tvStartIntrotext = (TextView) findViewById(R.id.tvStartIntrotext); 
    tvStartIntrotext.setTypeface(face); 
    bStartStart.setOnClickListener(this); 

    try { 
     fos = openFileOutput(NAMESFILE, Context.MODE_PRIVATE); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     names.add("Name Name"); 
     oos.writeObject(names); 
     oos.close(); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.startactivity, menu); 
    return true; 
} 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    Intent startIntent = new Intent(StartActivity.this, Choose.class); 
    startActivity(startIntent); 
} 
} 

讀取和顯示我在其他活動有這個至今:

public class Choose extends Activity implements OnClickListener { 

String NAMESFILE = "names_file"; 
FileInputStream fis; 

Button bChooseChoose, bChooseAdd; 
Typeface face; 
TextView tvChoosePick; 
EditText etChooseAddnew; 
LinearLayout llMain; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    overridePendingTransition(R.anim.slideinright, R.anim.slideoutleft); 
    setContentView(R.layout.choose); 


    face = Typeface.createFromAsset(getAssets(), "andalemono.ttf"); 
    bChooseChoose = (Button) findViewById(R.id.bChooseChoose); 
    bChooseChoose.setTypeface(face); 
    bChooseChoose.setOnClickListener(this); 
    bChooseAdd = (Button) findViewById(R.id.bChooseAdd); 
    bChooseAdd.setTypeface(face); 
    bChooseAdd.setOnClickListener(this); 
    tvChoosePick = (TextView) findViewById(R.id.tvChoosePick); 
    tvChoosePick.setTypeface(face); 
    etChooseAddnew = (EditText) findViewById(R.id.etChooseAddnew); 
    etChooseAddnew.setTypeface(face); 
    etChooseAddnew.setBackgroundResource(R.color.white1); 
    etChooseAddnew.setHintTextColor(color.greytext); 
    llMain = (LinearLayout) findViewById(R.id.llMain); 


    try { 
     fis = openFileInput(NAMESFILE); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     ArrayList<Object> names = (ArrayList<Object>) ois.readObject();    

     ois.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    for (int i = 0; i < names.size(); i++) { 
     CheckBox cbb = new CheckBox(this); 
     cbb.setText(names.get(i)); 
     cbb.setTypeface(face); 
     cbb.setTextSize(16); 
     llMain.addView(cbb); 
    } 

} 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()){ 
    case R.id.bChooseChoose: 

     break; 
    case R.id.bChooseAdd: 

        /*This button for adding new list name*/ 

     break; 
    } 

    } 
} 

我在這裏得到的一個錯誤是我的for循環中的「setText」。還不知道如何從打開的文件中獲取信息以正確顯示在列表中。儘管for循環在沒有使用fileInput/Output時工作。
任何指向我可以嘗試的指針都會非常有幫助,因爲我是Android編程的新手。 :)
Thx!

回答

0

問題是names變量在try-catch塊內聲明並且無法從外部訪問。只要將申報了塊:

List<Object> names; 
try { 
    fis = openFileInput(NAMESFILE); 
    ObjectInputStream ois = new ObjectInputStream(fis); 
    names = (ArrayList<Object>) ois.readObject();    
    ois.close(); 
} catch (Exception e) { 
    e.printStackTrace(); 
    names = Collections.emptyList(); 
} 

UPDATE 你不能使用cbb.setText(names.get(i))因爲names.get(i)是不是字符串。這是一個對象(如果你在NAMESFILE中保存了字符串,實際上應該是String)。
,可以將其情況爲String:

cbb.setText((String)names.get(i)) 

或使用toString方法:

cbb.setText(names.get(i).toString()) 
+0

謝謝您的回答!後續問題:我意識到自從我首次在第一個活動中聲明它之後,我對名稱變量有些疑問。這幫助我再次宣佈「名字」我認爲。然而,我的第二個活動中的「setText」的錯誤仍然存​​在,這是我檢查輸出/輸入是否工作的方式;)。有沒有更簡單的方法來檢查這可能? – bakatuna 2013-02-15 15:05:34

+0

@bakatuna你究竟得到了什麼錯誤? – 2013-02-15 15:07:02

+0

TextView類型中的方法setText(CharSequence)不適用於參數(Object) - 是消息。 – bakatuna 2013-02-15 15:10:03

相關問題