Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android LinearLayout.addView(视图)方法调用上的IllegalStateException_Android - Fatal编程技术网

Android LinearLayout.addView(视图)方法调用上的IllegalStateException

Android LinearLayout.addView(视图)方法调用上的IllegalStateException,android,Android,谁能告诉我为什么会发生这种情况,请阅读下面的内容。 我有自己的类数据,它扩展了按钮。在我的活动类中,我有一个列表,在每次单击按钮时都会添加新的数据对象。我希望在配置更改后,即方向更改后,将类数据的创建对象保留在屏幕上。所以我重写了onSaveInstanceState(),并使用它在onCreate()方法中恢复数据。在上述方法中,我保存对象列表中的每个数据对象。在onCreate()方法中,我试图恢复数据,如下所示: public void onCreate(Bundle savedInsta

谁能告诉我为什么会发生这种情况,请阅读下面的内容。 我有自己的类数据,它扩展了按钮。在我的活动类中,我有一个列表,在每次单击按钮时都会添加新的数据对象。我希望在配置更改后,即方向更改后,将类数据的创建对象保留在屏幕上。所以我重写了onSaveInstanceState(),并使用它在onCreate()方法中恢复数据。在上述方法中,我保存对象列表中的每个数据对象。在onCreate()方法中,我试图恢复数据,如下所示:

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

}  

我唯一能说的就是不要保存小部件或任何需要这样一个上下文的东西。当方向更改时,活动将被销毁,并使用新上下文创建。这就是为什么你会看到你的错误。这些按钮是做什么用的?为什么有这么多,为什么你要子类化按钮?为什么它们被称为数据?通常数据与按钮没有关联。

我唯一能说的是不要保存小部件或任何需要类似上下文的内容。当方向更改时,活动将被销毁,并使用新上下文创建。这就是为什么你会看到你的错误。这些按钮是做什么用的?为什么有这么多,为什么你要子类化按钮?为什么它们被称为数据?通常,数据与按钮没有关联

  • 最初的问题是:

    在本例中,由于子视图(在您的案例中为按钮/数据)已经有父视图(视图组或在您的案例中为LinearLayout),因此会引发
    IllegalStateException
    。这意味着您只能将视图添加到视图组一次。如果要将它们添加到新的视图组,则必须首先在原始视图组上调用
    .removeView()

    由于您正在将数据对象保存到bundle,我假设您正在多次调用
    .addView(Data)
    ,而中间没有调用
    .removeView(Data)

  • 其他问题:

    您正在将数据保存到捆绑包中。“数据扩展”按钮不可序列化,因此不应将数据标记为可序列化

    首先,为什么要将按钮保存到一个捆绑包中

  • 最初的问题是:

    在本例中,由于子视图(在您的案例中为按钮/数据)已经有父视图(视图组或在您的案例中为LinearLayout),因此会引发
    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);  
        }  
    
    }