Android 如何使用Kotlin修复此错误,找不到片段构造函数?
我正在使用Kotlin开发Android 如何使用Kotlin修复此错误,找不到片段构造函数?,android,android-fragments,kotlin,Android,Android Fragments,Kotlin,我正在使用Kotlin开发Android应用程序。在我的应用程序中,包含Tab和ViewPager,因此我实现了这两个选项卡。当我移动到另一个活动并compack to Tab view activity时,应用程序将停止运行,并且logcat在错误下方显示 java.lang.RuntimeException:无法启动活动组件信息{com.crypto.wallet/com.crypto.wallet.activities.MainActivity}:android.support.v4.ap
Android
应用程序。在我的应用程序中,包含Tab
和ViewPager
,因此我实现了这两个选项卡。当我移动到另一个活动并compack to Tab view activity时,应用程序将停止运行,并且logcat
在错误下方显示
java.lang.RuntimeException:无法启动活动组件信息{com.crypto.wallet/com.crypto.wallet.activities.MainActivity}:android.support.v4.app.Fragment$实例化异常:无法实例化片段com.crypto.wallet.activities.ReceiveFragment:找不到片段构造函数
MyFragment.kt
@SuppressLint("ValidFragment")
class ReceiveFragment(private val transactionList: List<TransactionEntity>, val appDatabase: AppDatabase, private val direction: TransactionAdapterDirection,
val networkDefinitionProvider: NetworkDefinitionProvider) : Fragment(){
private var linearLayoutManager: LinearLayoutManager? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val rootView = inflater.inflate(R.layout.receive_fragment, container, false)
val recyclerView = rootView.findViewById<RecyclerView>(R.id.transaction_recycler_in) as RecyclerView
linearLayoutManager = LinearLayoutManager(getActivity(), LinearLayout.VERTICAL, false)
recyclerView.layoutManager = linearLayoutManager
recyclerView.adapter = TransactionRecyclerAdapter(transactionList,appDatabase,direction,networkDefinitionProvider)
recyclerView.setHasFixedSize(true);
return rootView
}
}
override fun getItem(position: Int): Fragment? {
var fragment: Fragment? = null
when (position) {
//0 -> fragment = ReceiveFragment(MytransactionList,MyappDatabase,Myincoming,MynetworkDefinitionProvider)
0 -> fragment = ReceiveFragment(MyIT,MyAppDatabase,MyIncoming,MyNetwork)
1 -> fragment = SendFragment()
}
return fragment
}
Main.kt
OnCreate()
致命异常:主
进程:com.crypto.wallet,PID:29313
java.lang.RuntimeException:无法启动活动组件信息{com.crypto.wallet/com.crypto.wallet.activities.MainActivity}:android.support.v4.app.Fragment$实例化异常:无法实例化片段com.crypto.wallet.activities.ReceiveFragment:找不到片段构造函数
位于android.support.v4.app.FragmentController.restoreAllState(FragmentController.java:152)
位于android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:330)
位于android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:84)
位于com.crypto.wallet.activities.MainActivity.onCreate(MainActivity.kt:194)
当您获得有关错误的简短描述时,您将看到: 避免在片段中使用非默认构造函数:使用默认构造函数加上
片段setArguments(Bundle)
而不是更少。
从片段文档中:
每个片段都必须有一个空构造函数,以便在恢复其活动状态时可以实例化它。强烈建议子类不要有其他带参数的构造函数,因为当片段被重新实例化时,不会调用这些构造函数;相反,调用者可以使用setArguments(Bundle)
提供参数,然后使用getArguments()
片段检索参数
例如:
fun newInstance(bundle : Bundle) : ReceiveFragment{
val fragment = ReceiveFragment()
fragment.arguments=bundle
return fragment
}
现在调用片段:
0 -> fragment = ReceiveFragment.newInstance(new Bundle)
更多信息:您可以做的是创建一个具有零参数的默认构造函数
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment LoginFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
ReceiveFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
// Or from your code, you can use Gson
val prefs = applicationContext.getSharedPreferences("MyPref", 0)
val gson = Gson()
val json = prefs.getString("MyObject", "")
val person1: List<TransactionEntity> = gson.fromJson(json,
ArrayList<TransactionEntity>()::class.java)
}
}
您可以在onCreate
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
email = it.getString(ARG_PARAM1)
password = it.getString(ARG_PARAM2)
}
// Or from your code, you can use Gson
val prefs = applicationContext.getSharedPreferences("MyPref", 0)
val gson = Gson()
val json = prefs.getString("MyObject", "")
val person1: List<TransactionEntity> = gson.fromJson(json,
ArrayList<TransactionEntity>()::class.java)
}
希望这有助于片段应该有一个带有0个参数的默认构造函数。在片段中使用非默认构造函数是一种不好的做法。请使用
singleton
方法,并按照@VladyslavMatviienkoOkay所述创建默认构造函数,我将尝试您的技巧@VladyslavMatviienko@VladyslavMatviienko,是的,当活动重新创建时,在某些情况下,它可以调用默认构造函数。我将检查并实现此构造函数。请检查以下答案:是。我对此表示怀疑,我的参数不是字符串类型,而是自定义类型。就像“列表”一样,我如何才能添加到putString()。。。??????e、 g:fun newInstance(myIT:List,myAppDatabase:AppDatabase,myIncoming:TransactionaAdapterDirection,myNetwork:NetworkDefinitionProvider),因此只需替换为您的参数,例如:)好的,没有参数它就无法正常工作。我可以在这里使用GSON吗?是的,当然可以,在newInstance
方法中,让我为您编辑一点我需要在newInstance()中获取此参数,而不是在oncreate()中获取此“putString(ARG_PARAM1,PARAM1)putString(ARG_PARAM2,PARAM2)”我需要使用GSON
fun newInstance(bundle : Bundle) : ReceiveFragment{
val fragment = ReceiveFragment()
fragment.arguments=bundle
return fragment
}
0 -> fragment = ReceiveFragment.newInstance(new Bundle)
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment LoginFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
ReceiveFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
// Or from your code, you can use Gson
val prefs = applicationContext.getSharedPreferences("MyPref", 0)
val gson = Gson()
val json = prefs.getString("MyObject", "")
val person1: List<TransactionEntity> = gson.fromJson(json,
ArrayList<TransactionEntity>()::class.java)
}
}
0 -> 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)
}
// Or from your code, you can use Gson
val prefs = applicationContext.getSharedPreferences("MyPref", 0)
val gson = Gson()
val json = prefs.getString("MyObject", "")
val person1: List<TransactionEntity> = gson.fromJson(json,
ArrayList<TransactionEntity>()::class.java)
}
class ReceiveFragment: Fragment()