Java 是否可以在Android Kotlin中的活动上使用newInstance()
事实上,我对安卓系统还不熟悉。我现在对如何在片段中实现newInstance()感到困惑。我这里有2个片段和1个活动: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
- 作为抽象类的片段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)
}
}
}