Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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 是否可以在Android Kotlin中的活动上使用newInstance()_Java_Android_Kotlin_Android Fragments - Fatal编程技术网

Java 是否可以在Android Kotlin中的活动上使用newInstance()

Java 是否可以在Android Kotlin中的活动上使用newInstance(),java,android,kotlin,android-fragments,Java,Android,Kotlin,Android Fragments,事实上,我对安卓系统还不熟悉。我现在对如何在片段中实现newInstance()感到困惑。我这里有2个片段和1个活动: 作为抽象类的片段A 片段B作为包含参数的主片段类 MainActivity.kt作为活动 因此,我得到了如下错误日志: Caused by androidx.fragment.app.Fragment$e: Unable to instantiate fragment : could not find Fragment constructor ............ Ca

事实上,我对安卓系统还不熟悉。我现在对如何在片段中实现newInstance()感到困惑。我这里有2个片段和1个活动:

  • 作为抽象类的片段A
  • 片段B作为包含参数的主片段类
  • MainActivity.kt作为活动
因此,我得到了如下错误日志:

Caused by androidx.fragment.app.Fragment$e: Unable to instantiate fragment : could not find Fragment constructor
............
Caused by java.lang.NoSuchMethodException: <init> []
       at java.lang.Class.getConstructor0
片段b.kt

abstract class FragmentA: BottomSheetDialogFragment() {

companion object {
fun newInstance(): FragmentA{
    return FragmentA()  //Got a red mark here, because I cannot create newInstance() in an abstract class
}
}
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setStyle(DialogFragment...,getStyle)
    }

}
class FragmentB(val Parameterss: AnyParametersHere) : FragmentA() {
    
    companion object {
    fun newInstance(): FragmentB{
        return FragmentB()  //Got a red mark here, because it requires parameter inside the FragmentB()
    }
    }
        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val dialog = super.onCreateDialog(savedInstanceState)
        ..................................................................
        return dialog

        }
    
    }
MainActivity.kt 在MainActivity.kt中,是否可以将newInstance()添加到它的伴生对象?如果不是,对于这种情况,最好的解决方案是什么

class MainActivity : AppCompatActivity() {

companion object {
        fun newInstance(): MainActivity {
            return newInstance()
        }
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    ...................................
    val fragmentB= FragmentB(this)
        fragmentB.show(supportFragmentManager, FragmentB.TAG)

    }

}

我很困惑,如果你有更好的解决方案,我会很感激。谢谢你

这里有很多不同的错误,我建议你阅读更多关于这个主题的内容。我将帮助你消除疑虑。让我们从您的代码开始

首先,FragmentA
FragmentA
是一个抽象类,因此当您遇到错误时

无法实例化片段

无法创建抽象类的实例,因为它没有完整的实现。如果是这样,首先就不应该将其标记为抽象。您应该在
FragmentB

现在来看片段B

类FragmentB(val参数ss:AnyParametersHere):FragmentA(){
正如您在内部看到的,您正在接受其构造函数中的参数。现在转到
newInstance()
方法。代码如下:

fun newInstance():FragmentB{
返回片段b()
}
您在这里正确地得到了一个错误或一个读取标记,因为您创建了
FragmentB
的一个实例,但是您没有在它的构造函数中传递任何参数,您将这些参数放入了它的构造函数中

现在我们来看看它的正确模式,当我们需要将
参数
从一个片段传递到另一个片段时,我们通常在片段中使用
newInstance
,我们通过
newInstance

下面是一个示例代码

伴生对象{
fun newInstance()=碎片B()。应用{
参数=Bundle().apply{
//将值放在这里的键值对中。
}
}
}
然后你会得到一个
FragmentB
的实例,作为
FragmentB.newInstance()
。你需要阅读更多关于这个主题的内容。在片段之间传输数据有多种方法


来到您的main活动这里您不需要
newInstance
,因为在活动之间,您可以直接使用
意图
,并在需要时以这种方式传输数据。

这里有许多不同的错误,我建议您阅读更多有关此主题的内容。我将帮助您消除疑虑。让我们从您的代码开始

首先,FragmentA
FragmentA
是一个抽象类,因此当您遇到错误时

无法实例化片段

您无法创建抽象类的实例,因为它没有完整的实现。如果有,首先不应将其标记为抽象。您应该从在
FragmentB中执行此操作的抽象类扩展

现在来看片段B

类FragmentB(val参数ss:AnyParametersHere):FragmentA(){
正如您在内部看到的,您正在接受其构造函数中的参数。现在转到
newInstance()
方法。代码如下:

fun newInstance():FragmentB{
返回片段b()
}
您在这里正确地得到了一个错误或一个读取标记,因为您创建了
FragmentB
的一个实例,但是您没有在它的构造函数中传递任何参数,您将这些参数放入了它的构造函数中

现在我们来看看它的正确模式,当我们需要将
参数
从一个片段传递到另一个片段时,我们通常在片段中使用
newInstance
,我们通过
newInstance

下面是一个示例代码

伴生对象{
fun newInstance()=碎片B()。应用{
参数=Bundle().apply{
//将值放在这里的键值对中。
}
}
}
然后你会得到一个
FragmentB
的实例,作为
FragmentB.newInstance()
。你需要阅读更多关于这个主题的内容。在片段之间传输数据有多种方法


来到您的main活动您不需要
newInstance
,在活动之间,您可以直接使用
意图
,并根据需要以这种方式传输数据。

FragmentB的构造函数不能有参数。操作系统使用空构造函数重新创建片段。您的
newInstance()
函数可以通过捆绑包将数据传递给片段,如果重新创建片段,操作系统将恢复该捆绑包。使用
requireundle()
获取您的参数,并将其分配给片段中第一个入口点的属性(
onCreateView()
onViewCreated()
,或
onCreateDialog()

一个常见的错误是为片段提供两个构造函数,一个为空,一个包含所需的参数,并使用
newInstance()中包含参数的构造函数
。问题是,当操作系统使用空构造函数重新创建片段时,您的参数将丢失。操作系统仅恢复捆绑包,而不是构造函数的参数,因为它专门使用空构造函数

请注意,bundle参数必须是受支持的类型之一,这些类型都是“基本”类、字符串、包、上述任何类型的数组和可序列化的

范例
class MyFragment: Fragment() {

    companion object {
        private const val SOME_ARG_KEY = "SOME_ARG_KEY"
        private const val SOME_OTHER_ARG_KEY = "SOME_OTHER_ARG_KEY"

        fun newInstance(someArgument: Long, someOtherArgument: String)
            = MyFragment().apply { 
                arguments = bundleOf(
                    SOME_ARG_KEY to someArgument,
                    SOME_OTHER_ARG_KEY to someOtherArgument,
                )
            }
    }

    lateinit var someArgument: Long
    lateinit var someOtherArgument: String

    //...

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        with (requireArguments()) {
            someArgument = getLong(SOME_ARG_KEY)
            someOtherArgument = getString(SOME_OTHER_ARG_KEY)
        }
    }
}