2010-12-29 11 views
0

誰かがこれがなぜ起こるのか教えてください。以下をお読みください。 Buttonを拡張する独自のクラスDataを持っています。私のアクティビティのクラスには、各ボタンのクリックで新しいDataオブジェクトを追加するListがあります。私は、構成の変更、すなわち向きの変更の後に、クラスDataの作成されたオブジェクトを画面上に保持したい。だからonSaveInstanceState()をオーバーライドし、それを使ってonCreate()メソッドでデータを復元しました。上記のメソッドでは、すべてのDataオブジェクトをオブジェクトのリストから保存しています。 onCreate()メソッドでは、私はこのように私のデータを復元しようとしている:LinearLayout.addView(view view)メソッド呼び出しでIllegalStateExceptionが発生する

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     button = (Button) findViewById(R.id.Button01); 
     layout = (LinearLayout) findViewById(R.id.MyLayout); 
     dataList = new ArrayList<Data>(); 

     if(savedInstanceState != null) { 
      int numberOfObjects = savedInstanceState.getInt("Number of objects"); 
      for (int i = 1; i < numberOfObjects; i++) { 
       Data tmp = (Data)savedInstanceState.getSerializable("Button name " + i); 
       if (tmp != null) { 
        dataList.add(tmp); 
       } 
       if (dataList.size() != 0) { 
// I'm using one of the lines at a time, uncommented here just for example: 
        layout.addView((Data)dataList.get(i-1)); // IllegalStateException happens here with advice to invoke removeView() method. I tried to call it on the method beginning, but no success. 
        layout.addView(new Data(getApplicationContext())); // This one is perfectly fine 
       } 
      } 
     } 

だから、最初のケースでは、私はIllegalStateExceptionが取得していますが、それは二人のための大きい働いています。私はその違いを理解していない。

@Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     Log.d("Dev", "onSaveInstanceState()"); 
     outState.putInt("Number of objects", dataList.size()); 
     for (Data object : dataList) { 
      outState.putSerializable("Button name " + object.getNumber() , object); 
     } 
    } 

そして、私のデータクラスが、何も特別な:

は、念のため、ここで私のonSaveInstanceState()メソッドである

package as.as.as; 

import java.io.Serializable; 

import android.content.Context; 
import android.widget.Button; 

public class Data extends Button implements Serializable { 
    public static int counter; 
    public int number; 

    public Data(Context context) { 
     super(context); 
     counter++; 
     this.number = counter; 
     this.setText("Button number " + Integer.toString(number)); 
    } 

    public String getNumber() { 
     return Integer.toString(number); 
    } 

} 
+0

"(Data)dataList.get(i-1)"には既に親があると思います。 どのようにデータをdataListに追加しますか? –

答えて

4
  1. 元の問題:IllegalStateExceptionは、この場合には(あなたのケースボタン/データで)子ビューがすでに親(のViewGroupまたはあなたのケースのLinearLayoutで)を持っているので、スローされ

    。つまり、ビューグループにビューを1回だけ追加できます。それらを新しいViewGroupに追加する場合は、最初に元のViewGroupで.removeView()を呼び出す必要があります。

    データオブジェクトをバンドルに保存しているので、.removeView(data)を間に呼び出しずに.addView(data)を複数回呼び出すと仮定します。

  2. 追加問題:

    あなたがバンドルにデータを保存しています。データはSerializableではないButtonを拡張するので、DataをSerializableとしてマークしないでください。

    ボタンを最初にバンドルに保存しているのはなぜですか?

+0

実行時に作成しているボタンを保存するにはどうすればよいですか? – Eugene

+0

'onCreate()'の中でそれらを作成します。 –

0

私が言うことができる唯一のことは、保存しないでウィジェットなどのコンテキストを必要とするもの。オリエンテーションが変更されると、アクティビティは破棄され、新しいコンテキストで作成されます。だからあなたはあなたのエラーを見るのです。これらのボタンは何をしていますか?なぜそんなにたくさんあり、ボタンをサブクラス化するのですか?なぜデータと呼ばれていますか?通常、データはボタンに関連付けられていません。

+0

構成の変更でデータの保存/復元を試みるだけで済みました。ご意見ありがとうございます。 – Eugene

+0

ウィジェットではなく、データを保存/復元する必要があります。 – Falmarri

+0

私はもう一度感謝します。 – Eugene

関連する問題