0

次のことを行うアプリを作成しています:
- 起動すると、スプラッシュ/情報アクティビティが表示されます。
- 次のアクティビティでは、名前のリストがチェックボックスとして表示されます
- ユーザーは EditText & Add-button を使用して新しい名前を追加できます (リストは動的に更新されます)
- アプリを閉じて再度開くと、以前に追加された名前が保存され、リストに表示されます。
情報を正しく保存およびロードできるかどうかを確認するために、startingactivity でリストを 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;
    }

    }
}

この時点で発生しているエラーの 1 つは、for ループの「setText」です。開いたファイルから情報を取得してリストに正しく表示する方法がまだわかりません。fileInput / Outputが使用されていない場合、forループは機能しますが。
私は Android プログラミングが初めてなので、私が試すことができることへのポインタは本当に役に立ちます。:)
ありがとう!

4

1 に答える 1

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();
}

UPDATEcbb.setText(names.get(i))そして、文字列ではないため 使用できませんnames.get(i)。これはオブジェクトです (文字列を に保存した場合、実際には文字列になるはずですNAMESFILE)。
文字列にケース化できます:

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

または使用toString方法:

cbb.setText(names.get(i).toString())
于 2013-02-15T14:48:33.520 に答える