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()”不能从静态上下文引用:\