Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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
Android 如何使用Kotlin修复此错误,找不到片段构造函数?_Android_Android Fragments_Kotlin - Fatal编程技术网

Android 如何使用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

我正在使用Kotlin开发
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()