Android LinearLayout.addView(视图)方法调用上的IllegalStateException
谁能告诉我为什么会发生这种情况,请阅读下面的内容。 我有自己的类数据,它扩展了按钮。在我的活动类中,我有一个列表,在每次单击按钮时都会添加新的数据对象。我希望在配置更改后,即方向更改后,将类数据的创建对象保留在屏幕上。所以我重写了onSaveInstanceState(),并使用它在onCreate()方法中恢复数据。在上述方法中,我保存对象列表中的每个数据对象。在onCreate()方法中,我试图恢复数据,如下所示:Android LinearLayout.addView(视图)方法调用上的IllegalStateException,android,Android,谁能告诉我为什么会发生这种情况,请阅读下面的内容。 我有自己的类数据,它扩展了按钮。在我的活动类中,我有一个列表,在每次单击按钮时都会添加新的数据对象。我希望在配置更改后,即方向更改后,将类数据的创建对象保留在屏幕上。所以我重写了onSaveInstanceState(),并使用它在onCreate()方法中恢复数据。在上述方法中,我保存对象列表中的每个数据对象。在onCreate()方法中,我试图恢复数据,如下所示: public void onCreate(Bundle savedInsta
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
}
}
}
还有我的数据类,但没什么特别的:
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);
}
}
我唯一能说的就是不要保存小部件或任何需要这样一个上下文的东西。当方向更改时,活动将被销毁,并使用新上下文创建。这就是为什么你会看到你的错误。这些按钮是做什么用的?为什么有这么多,为什么你要子类化按钮?为什么它们被称为数据?通常数据与按钮没有关联。我唯一能说的是不要保存小部件或任何需要类似上下文的内容。当方向更改时,活动将被销毁,并使用新上下文创建。这就是为什么你会看到你的错误。这些按钮是做什么用的?为什么有这么多,为什么你要子类化按钮?为什么它们被称为数据?通常,数据与按钮没有关联
IllegalStateException
。这意味着您只能将视图添加到视图组一次。如果要将它们添加到新的视图组,则必须首先在原始视图组上调用.removeView()
由于您正在将数据对象保存到bundle,我假设您正在多次调用.addView(Data)
,而中间没有调用.removeView(Data)
IllegalStateException
。这意味着您只能将视图添加到视图组一次。如果要将它们添加到新的视图组,则必须首先在原始视图组上调用.removeView()
由于您正在将数据对象保存到bundle,我假设您正在多次调用.addView(Data)
,而中间没有调用.removeView(Data)
因为它只是为了在配置更改时尝试保存/恢复数据。谢谢你的评论。你应该保存/还原数据,而不是小部件。因为它只是为了在配置更改时尝试保存/还原数据。谢谢你的评论。你应该保存/恢复数据,而不是小部件。我认为你的“(数据)数据列表。get(I-1)”已经有父项了。如何将数据添加到dataList?我认为您的“(数据)dataList.get(I-1)”已经有父级。如何将数据添加到数据列表?建议如何存储我在运行时创建的按钮?在
onCreate()
中创建按钮。建议如何存储我在运行时创建的按钮?在onCreate()
中创建按钮。
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);
}
}