如何使用Kotlin修复这个错误,找不到Fragment构造函数?
如何使用Kotlin修复这个错误,找不到Fragment构造函数?
我正在使用Kotlin开发Android应用程序。我的应用程序包含一个带有ViewPager的选项卡,所以我实现了这两个选项卡。当我切换到另一个活动并返回到选项卡视图活动时,应用程序会强制停止,并且logcat显示以下错误。\n
\njava.lang.RuntimeException: Unable to start activity ComponentInfo{com.crypto.wallet/com.crypto.wallet.activities.MainActivity}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.crypto.wallet.activities.ReceiveFragment: could not find Fragment constructor\n
\nMyFragment.kt\n@SuppressLint(\"ValidFragment\")\nclass ReceiveFragment(private val transactionList: List
\nViewPager.kt\noverride fun getItem(position: Int): Fragment? {\n var fragment: Fragment? = null\n when (position) {\n //0 -> fragment = ReceiveFragment(MytransactionList,MyappDatabase,Myincoming,MynetworkDefinitionProvider)\n 0 -> fragment = ReceiveFragment(MyIT, MyAppDatabase, MyIncoming, MyNetwork)\n 1 -> fragment = SendFragment()\n }\n return fragment\n }\n
\nMain.kt OnCreate()\nval viewPager = findViewById
\nOnResume()\nval prefs = applicationContext.getSharedPreferences(\"MyPref\", 0)\n val gson = Gson()\n val json = prefs.getString(\"MyObject\", \"\")\n val person1: List
\nUPDATE: \n尝试了这个后,我得到了相同的错误(我尝试了Bundle和Shared pref两种方法):\ncompanion object {\n @JvmStatic\n fun newInstance(myIT: List
\nMain.kt:\nval bundle = Bundle()\n val gson_budle = Gson()\n val json_bundle = gson_budle.toJson(it)\n bundle.putSerializable(\"MySerializable\", json_bundle)\n val sharedPreferences = getSharedPreferences(myPreferences, Context.MODE_PRIVATE)\n val editor = sharedPreferences.edit()\n val gson = Gson()\n val json = gson.toJson(it)\n editor.putString(\"MyObject\", json)\n editor.putString(\"MyObject_json_bundle\", json_bundle)\n Log.d(\"Karthi\",\"After - IT\" + json)\n Log.d(\"Karthi\",\"After - IT\" + json_bundle)\n editor.apply()\n
\n
\nFATAL EXCEPTION: main\n Process: com.crypto.wallet, PID: 29313\n java.lang.RuntimeException: Unable to start activity ComponentInfo{com.crypto.wallet/com.crypto.wallet.activities.MainActivity}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.crypto.wallet.activities.ReceiveFragment: could not find Fragment constructor\n at android.support.v4.app.FragmentController.restoreAllState(FragmentController.java:152)\n at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:330)\n at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:84)\n at com.crypto.wallet.activities.MainActivity.onCreate(MainActivity.kt:194)\n
问题的原因是该代码中的Fragment类没有提供无参构造函数。解决方法是为Fragment类添加一个空的构造函数,以避免异常的发生。以下是修复该bug的Kotlin代码示例:
class ReceiveFragment : Fragment {
private var transactionList: List
private var appDatabase: AppDatabase? = null
private var direction: TransactionAdapterDirection? = null
private var networkDefinitionProvider: NetworkDefinitionProvider? = null
// 添加空的构造函数以避免异常
constructor() : super()
constructor(
transactionList: List
appDatabase: AppDatabase,
direction: TransactionAdapterDirection,
networkDefinitionProvider: NetworkDefinitionProvider
) {
this.transactionList = transactionList
this.appDatabase = appDatabase
this.direction = direction
this.networkDefinitionProvider = networkDefinitionProvider
}
}
这样修改后,代码将不再抛出异常,并且可以正常编译。
在使用Kotlin修复"could not find Fragment constructor"这个错误时,你可以做以下操作:
首先,在Fragment类中创建一个没有参数的默认构造函数。
然后,在伴生对象中创建一个newInstance方法,用于创建新的Fragment实例并传递参数。在该方法中,使用Bundle将参数存储起来。
接下来,在使用Fragment的地方,调用newInstance方法并传入参数,将返回的Fragment实例赋值给相应的变量。
最后,在Fragment的onCreate方法中,通过arguments获取传递的参数。
下面是具体的代码示例:
companion object {
fun newInstance(param1: String, param2: String) =
ReceiveFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
class ReceiveFragment: Fragment() {
// Empty constructor
}
// 使用示例
val receiveFragment = ReceiveFragment.newInstance(firstParam, secondParam)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
email = it.getString(ARG_PARAM1)
password = it.getString(ARG_PARAM2)
}
}
通过以上步骤,你可以解决"could not find Fragment constructor"的错误。希望这能帮到你。
这个问题的原因是在使用Kotlin时,无法找到Fragment的构造函数。根据Fragment文档,每个Fragment必须有一个空构造函数,这样在恢复其所属Activity的状态时才能实例化。强烈建议子类不要有其他带参数的构造函数,因为当Fragment重新实例化时,这些构造函数不会被调用。相反,调用者可以使用setArguments(Bundle)提供参数,然后Fragment可以使用getArguments()检索参数。
解决方法是使用newInstance方法来创建Fragment实例,并将参数传递给setArguments方法。示例如下:
fun newInstance(bundle: Bundle): ReceiveFragment {
val fragment = ReceiveFragment()
fragment.arguments = bundle
return fragment
}
然后使用newInstance方法来调用Fragment:
fragment = ReceiveFragment.newInstance(Bundle())
相关信息可以在Fragment文档中找到:http://developer.android.com/reference/android/app/Fragment.html#Fragment()。此外,可以参考以下回答:stackoverflow.com/questions/12062946/…。