2

私は初心者プログラマーであり、Eclipseを使用してAndroidコーディングを学ぼうとしています。StackOverflowを使用するのはこれが初めてです。

チュートリアルのためだけに、簡単な動物百科事典を作りたいと思います。

そのため、私のホームクラスには、「犬」、「猫」、「鳥」などのボタンがあります。ボタンをクリックすると、同じレイアウトになりますが、もちろん内容が異なります。

  • そこで、画像の下に配置するテキスト(「ブルドッグ」や「ハスキー」など)ArrayList<Integer>を格納R.drawable.xxxおよび格納するためのAnimalDataという名前のクラスを作成しました 。ArrayList<String>

  • 次に、ChangeContentという名前のクラスを作成して、これらすべての描画可能テキストとテキストをXMLに設定しました。

  • しかし、ボタンをクリックするたびに、予期せず停止したエラーが発生します

以下は短縮されたホームクラスです。「クラッシュメーカー」はここにはありません。を使用して1行あたりのコード行全体をチェックしたThread.sleep(2000)ので、アプリが2秒前にクラッシュした場合、エラーはsleep()コードの前にあり、その逆も同様です。

public class Home extends Activity implements OnClickListener{
    Button dog, cat, bird;
    AnimalData ad;
    ChangeContent cc;

    private ArrayList<Integer> drawable;
    private ArrayList<String> title;

public Home(){
    ad = new AnimalData();
    cc = new ChangeContent(ad);
    drawable = new ArrayList<Integer>();
    title = new ArrayList<String>()
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.home);
    //set the findViewById for all the buttons
    //set onClickListener() to all the buttons
}

public void onClick(View v) {
    switch (v.getId()){
    case R.id.bDog:
        drawable.add(R.drawable.xxx);
        drawable.add(R.drawable.yyy);
        title.add("Bulldog");
        title.add("Husky");
        break;
    case R.id.Cat:
        //same
        break;
    case R.id.bBird:
        //same
        break;
    }
    ad.setDrawable(drawable);
    ad.setTitle(title);
    Intent i = new Intent("animal.ChangeContent"); //from Manifest
    startActivity(i);
}
}

AnimalDataは典型的なゲッターセッターなので、そのためのコードはスキップします

コンストラクターの最初の行にsleep()を配置しても効果がないため、ChangeContentが開始された直後にエラーが発生します。

public class ChangeContent extends Activity {

    TextView title1, title2;
    ImageView pic1, pic2;
    private ArrayList<Integer> drawable;
    private ArrayList<String> title;

public ChangeContent(AnimalData data){
    drawable = new ArrayList<Integer>();
    title = new ArrayList<String>();
    drawable = data.getDrawable();
    title = data.getTitle();
}
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.animal_info);

    //findViewById for the TextView and ImageView
    //setText() for TextView and setImageResource() for ImageView
}
}

長い質問でごめんなさい、私はそれをできるだけ短くしようとしました。皆さんは私がエラーを理解するのを手伝ってくれますか?前に感謝します

4

3 に答える 3

1

putStringArrayListメソッドとputIntegerArrayListメソッドを配置していないのに対し、インテントからarraylistを取得しようとしています。

putIntegerArrayListExtra(String name, ArrayList<Integer> value)

putStringArrayListExtra(String name, ArrayList<String> value)

したがって、呼び出しアクティビティを次のように変更します。

Intent i = new Intent(Home.this, ChangeContent.class); //from Manifest
i.putIntegerArrayListExtra("drawables", drawable);
i.putStringArrayListExtra("titles", titles);
startActivity(i);

次のメソッドを使用して、onCreateメソッドのインテントからデータを取得します:getIntegerArrayListExtra、およびgetStringArrayListExtra

contentChangedメソッドを静的にすることでフォローすることもできます。これにより、アプリケーションコードに多くの変更を加える必要がなくなり、次のようになります。

public class ChangeContent extends Activity {

    TextView title1, title2;
    ImageView pic1, pic2;
    private static ArrayList<Integer> drawable;
    private static ArrayList<String> title;

public static ChangeContent(AnimalData data){
    drawable = new ArrayList<Integer>();
    title = new ArrayList<String>();
    drawable = data.getDrawable();
    title = data.getTitle();
}
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.animal_info);

    //findViewById for the TextView and ImageView
    //setText() for TextView and setImageResource() for ImageView
}
}
于 2012-04-07T06:21:10.373 に答える
1

ここでRajaReddyPによる回答を参照してください。

https://stackoverflow.com/a/9937854

sendクラスでは、次を使用します。

Intent intent = new Intent(PhotoActivity.this,PhotoActivity1.class ); 
intent.putIntegerArrayListExtra("VALUES", image);               
startActivity(cameraIntent); 

..およびレシーバークラスでの使用:

Intent i = getIntent();
ArrayList<Integer> img = i.getIntegerArrayListExtra("VALUES");
于 2012-06-15T14:19:06.290 に答える
0

あなたのアプローチは間違っています-

public Home(){
ad = new AnimalData();
cc = new ChangeContent(ad);
drawable = new ArrayList<Integer>();
title = new ArrayList<String>()

}

ChangeContentはActivityクラスであるため、このようなパラメーターを渡さないでください。

通過するクラスはシリアル化可能であり、それを使用する必要があります-

startActivity(new Intent(this, ChangeContent.class)
             .putExtra("key", ad);

そして、ChangeContentクラスで、Intentからクラスを抽出します

したがって、コード設計を変更して先に進んでください。幸運を祈ります。

于 2012-04-07T06:25:27.813 に答える