Java Can';我无法实现Parcelable,因为我可以';不要将创建者字段设置为静态

Java Can';我无法实现Parcelable,因为我可以';不要将创建者字段设置为静态,java,android,parcelable,Java,Android,Parcelable,Parcelable文档说CREATOR字段必须是静态的,但是当我尝试以这种方式实现它时,我得到了错误“内部类不能有静态声明” 我试图通过将我的CategoryButton放在一个单独的类中(没有在MainActivity中将其声明为一个内部类)来解决这个问题,但随后我无法调用构造函数中的getApplicationContext() public class MainActivity extends ActionBarActivity { private class Categor

Parcelable
文档说
CREATOR
字段必须是静态的,但是当我尝试以这种方式实现它时,我得到了错误“内部类不能有静态声明”

我试图通过将我的
CategoryButton
放在一个单独的类中(没有在
MainActivity
中将其声明为一个内部类)来解决这个问题,但随后我无法调用构造函数中的
getApplicationContext()

public class MainActivity extends ActionBarActivity {


    private class CategoryButton extends Button implements Parcelable{
        private ArrayList<CategoryButton> buttons = null;
        private RelativeLayout.LayoutParams params = null;
        public CategoryButton(Context context){
            super(context);
        };
        public void setButtons(ArrayList<CategoryButton> buttons){
            this.buttons = buttons;
        }
        public void setParams(RelativeLayout.LayoutParams params){
            this.params = params;
        }
        public ArrayList<CategoryButton> getButtons(){
            return this.buttons;
        }
        public RelativeLayout.LayoutParams getParams(){
            return this.params;
        }



        public int describeContents() {
            return 0;
        }
        public void writeToParcel(Parcel out, int flags) {
            out.writeList(buttons);
        }
        public static final Parcelable.Creator<CategoryButton> CREATOR // *** inner classes cannot have static declarations
                = new Parcelable.Creator<CategoryButton>() {
            public CategoryButton createFromParcel(Parcel in) {
                return new CategoryButton(in); // *** 'package.MainActivity.this' cannot be referenced from a static context
            }

            public CategoryButton[] newArray(int size) {
                return new CategoryButton[size];
            }
        };

        private CategoryButton(Parcel in) {
            super(getApplicationContext());
            in.readList(buttons, null);
        }

    }

// ...other activity code
公共类MainActivity扩展了ActionBarActivity{
私有类CategoryButton扩展按钮实现了Parcelable{
私有ArrayList按钮=null;
private RelativeLayout.LayoutParams params=null;
公共类别按钮(上下文){
超级(上下文);
};
公共无效设置按钮(ArrayList按钮){
这个按钮=按钮;
}
public void setParams(RelativeLayout.LayoutParams参数){
this.params=params;
}
公共阵列列表getButtons(){
返回这个按钮;
}
public RelativeLayout.LayoutParams getParams(){
返回此.params;
}
公共int描述内容(){
返回0;
}
公共无效写入包(包出,内部标志){
out.writeList(按钮);
}
public static final Parcelable.Creator//***内部类不能有静态声明
=新的Parcelable.Creator(){
公共类别按钮createFromParcel(中的地块){
返回新的CategoryButton(in);//***'package.MainActivity。无法从静态上下文引用此'
}
公共类别按钮[]新数组(整数大小){
返回新的CategoryButton[大小];
}
};
专用类别按钮(地块中){
super(getApplicationContext());
in.readList(按钮,空);
}
}
//…其他活动代码

您需要将
类别按钮设置为内部静态,即

private static class CategoryButton extends Button implements Parcelable {
    ...

我不明白你为什么要扩展按钮并实现可打包,因为对于我的应用程序,我需要有一个包含其他按钮的属性
按钮
,为什么你需要实现
可打包
?因为我需要将
按钮
属性作为
额外的
传递给一个
意图
,它是s一个
ArrayList
所以
CategoryButton
需要实现
Parcelable
以便调用
putParcelableArrayListExtra(String name,ArrayListI刚刚尝试了这个方法,虽然它解决了
CREATOR
字段问题,但它使我无法调用
getApplicationContext()
传递给构造函数中的super。按钮是一个视图,即将对上下文的调用更改为
super(getContext());
Hmm现在我得到错误
在调用超类型构造函数之前无法引用'view.getContext()'。
好吧,它是一个自定义构造函数,只需将其替换为
private CategoryButton即可(@NonNull Context Context,Parcel in){…
。但是根据您的逻辑,您可能需要更改调用此私有构造函数的方式。我只是尝试按照您的描述更改构造函数的签名,然后从
createFromParcel()
调用它,如下所示:
返回新CategoryButton(getContext(),in)
但是我回到了错误
非静态方法“getContext()”不能从静态上下文引用
:\