Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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
Java 在创建扩展父片段的子片段时调用newInstance()_Java_Android_Class_Oop_Android Fragments - Fatal编程技术网

Java 在创建扩展父片段的子片段时调用newInstance()

Java 在创建扩展父片段的子片段时调用newInstance(),java,android,class,oop,android-fragments,Java,Android,Class,Oop,Android Fragments,我有一个名为parent的父对话片段和一个名为child的子对话片段,它扩展了parent 但是,我需要能够在Parent中初始化一些变量,即使我正在实例化Child,所以我尝试的是: 在父母中 public static TheParent newInstance(int myInt) { Bundle args = new Bundle(); TheParent fragment = new TheParent(); args.putInt(ARGUMENT_MYIN

我有一个名为parent的父对话片段和一个名为child的子对话片段,它扩展了parent

但是,我需要能够在Parent中初始化一些变量,即使我正在实例化Child,所以我尝试的是:

在父母中

public static TheParent newInstance(int myInt) {
    Bundle args = new Bundle();
    TheParent fragment = new TheParent();
    args.putInt(ARGUMENT_MYINT, myInt);
    fragment.setArguments(args);
    return fragment;
}
然后在孩子身上:

public static TheChild newInstance(int myInt) {
    return super.newInstance(myInt);
}
但是,由于静态上下文的原因,它不喜欢我这样做


在孩子身上调用newInstance()并让它调用父对象的newInstance()的正确方法是什么?

静态方法,如parent中的newInstance是“类”方法。因此,您应该调用parent.newInstance(…),而不是调用super.newInstance。记住调用静态方法的方法是使用类名。希望能有帮助。 综上所述,child中的newInstance方法的返回值类型为“TheChild”。这意味着返回“TheParent”实例是不可能的,这将导致编译时错误,您将在更改孩子中的代码时立即看到该错误:
“return super.newInstance()”到“TheParent.newInstance()”

这是我为了避免重复子类中的所有逻辑而做的:

public static TheChild newInstance(int myInt) {
    TheChild fragment = new TheChild();
    fragment.setArguments(TheParent.newInstance(myInt).getArguments());
    return fragment;
}

当然,此解决方案会立即创建父对象的第二个实例。

因此,如果父对象需要参数才能进行设置,我如何正确声明/设置子对象?父类需要myInt将父类中的初始化代码放入接受int的私有构造函数中。然后从parent.newInstance调用该构造函数并将其传递给myInt。然后,在child类中,您需要一个构造函数,它也接受int并调用super(myInt),这是您刚刚创建的父构造函数,在TheChild.newInstance中,您将在child中调用此构造函数并将其传递给myInt。这样,子级和父级都将运行父级初始化代码,并且在子级中创建的片段的类型将是child而不是parent。