如何使用Kotlin修复这个错误,找不到Fragment构造函数?

14 浏览
0 Comments

如何使用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, val appDatabase: AppDatabase, private val direction: TransactionAdapterDirection,\n val networkDefinitionProvider: NetworkDefinitionProvider) : Fragment() {\n private var linearLayoutManager: LinearLayoutManager? = null\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n }\n override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {\n val rootView = inflater.inflate(R.layout.receive_fragment, container, false)\n val recyclerView = rootView.findViewById(R.id.transaction_recycler_in) as RecyclerView\n linearLayoutManager = LinearLayoutManager(getActivity(), LinearLayout.VERTICAL, false)\n recyclerView.layoutManager = linearLayoutManager\n recyclerView.adapter = TransactionRecyclerAdapter(transactionList, appDatabase, direction, networkDefinitionProvider)\n recyclerView.setHasFixedSize(true);\n return rootView\n }\n}\n\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(R.id.viewpager)\n if (viewPager != null) {\n val adapter = ViewPagerAdapter(supportFragmentManager, it, appDatabase, INCOMING, networkDefinitionProvider)\n viewPager.adapter = adapter\n }\n val pref = applicationContext.getSharedPreferences(\"MyPref\", 0) // 0 - for private mode\n val editor = pref.edit()\n val gson = Gson()\n val json = gson.toJson(it)\n editor.putString(\"MyObject\", json)\n editor.apply()\n\nOnResume()\nval prefs = applicationContext.getSharedPreferences(\"MyPref\", 0)\n val gson = Gson()\n val json = prefs.getString(\"MyObject\", \"\")\n val person1: List = gson.fromJson(json, ArrayList()::class.java)\n\nUPDATE: \n尝试了这个后,我得到了相同的错误(我尝试了Bundle和Shared pref两种方法):\ncompanion object {\n @JvmStatic\n fun newInstance(myIT: List, myAppDatabase: AppDatabase, myIncoming: TransactionAdapterDirection,\n myNetwork: NetworkDefinitionProvider,\n bundle: Bundle) =\n ReceiveFragment(myIT, myAppDatabase, myIncoming, myNetwork, bundle).apply {\n arguments = Bundle().apply {\n /* val prefs = getActivity()!!.getApplicationContext().getSharedPreferences(\"myPrefs\", 0)\n val gson = Gson()\n val json = prefs.getString(\"MyObject\", \"\")\n val person1: List = gson.fromJson(json,\n ArrayList()::class.java)\n Log.d(\"Karthi\", \"Frag-GSON \" + person1)*/\n val dd = bundle.getSerializable(\"MySerializable\")\n Log.d(\"Karthi\", \"Frag-GSON \" + dd)\n }\n }\n }\n\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

0
0 Comments

问题的原因是该代码中的Fragment类没有提供无参构造函数。解决方法是为Fragment类添加一个空的构造函数,以避免异常的发生。以下是修复该bug的Kotlin代码示例:

class ReceiveFragment : Fragment {

private var transactionList: List? = null

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

}

}

这样修改后,代码将不再抛出异常,并且可以正常编译。

0
0 Comments

在使用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"的错误。希望这能帮到你。

0
0 Comments

这个问题的原因是在使用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/…

0