我是android的新手,只是kotlin的初学者。我有带有标签布局和viewpager的android应用。我有两个选项卡的两个片段。我需要一些从main.kt到fragment.kt的值,我不知道如何将这些值从main.kt传递给fragment.kt。
在我的fragment.kt文件中,我有一个要调用这样的另一个类
recyclerView.adapter = TransactionRecyclerAdapter(transactionList,appDatabase,direction,networkDefinitionProvider)
此类必须有一个参数,因此我需要main.kt中的值。
我无法传递捆绑包中的值,因为值返回的类型是这样的
private val mfragmentAB = appDatabase
private val mfragmentIT: List<TransactionEntity>? = it
private val mfragmentINC : TransactionAdapterDirection? = incoming
private val mfragmentnetwork : NetworkDefinitionProvider? = networkDefinitionProvider
private val mfragmentviewpager : ViewPager? = viewPager
,所以序列化和可缩放不起作用。请指导我。
main.kt
private fun setupViewPager(viewPager: ViewPager, it: List<TransactionEntity>?, incoming: TransactionAdapterDirection) {
val incomingData = ArrayList<TransactionEntity>()
val outgoingData = ArrayList<TransactionEntity>()
val adapter = ViewPagerAdapter(supportFragmentManager, viewPager, it, incoming, appDatabase, networkDefinitionProvider)
if(incoming == INCOMING) {
if (it != null) {
incomingData.addAll(it)
}
}else {
if (it != null) {
outgoingData.addAll(it)
}
}
adapter.addFragment(ReceiveFragment(), "SEND")
adapter.addFragment(SendingFragment(), "RECEIVE")
viewPager.adapter = adapter
adapter.notifyDataSetChanged();
}
class ViewPagerAdapter(manager: FragmentManager, viewPager: ViewPager?, it: List<TransactionEntity>?, incoming: TransactionAdapterDirection?, appDatabase: AppDatabase?, networkDefinitionProvider: NetworkDefinitionProvider?) : FragmentPagerAdapter(manager)
{
private val mFragmentList: ArrayList<Fragment> = ArrayList<Fragment>()
private val mFragmentTitleList: ArrayList<String> = ArrayList<String>()
private val mfragmentAB = appDatabase
private val mfragmentIT: List<TransactionEntity>? = it
private val mfragmentINC : TransactionAdapterDirection? = incoming
private val mfragmentnetwork : NetworkDefinitionProvider? = networkDefinitionProvider
private val mfragmentviewpager : ViewPager? = viewPager
override fun getCount(): Int {
return mFragmentList.size
}
override fun getItem(position: Int): Fragment? {
var fragment: Fragment? = null
if (position == 0) {
fragment = SendingFragment()
} else if (position == 1) {
fragment = ReceiveFragment()
}
return fragment
}
fun addFragment(fragment: Fragment, title: String) {
mFragmentList.add(fragment)
mFragmentTitleList.add(title)
}
override fun getPageTitle(position: Int): CharSequence? {
return mFragmentTitleList[position]
}
override fun getItemPosition(fragItem: Any): Int {
var position = 0
if (fragItem is ReceiveFragment) {
position = 0
} else if (fragItem is SendingFragment) {
position = 1
}
return if (position >= 0) position else PagerAdapter.POSITION_NONE
}
}
frgment.kt
class ReceiveFragment : 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
}
}
更新
companion object {
/**
* new instance pattern for fragment
*/
@JvmStatic
fun newInstance(myObject: List<TransactionEntity>?): ReceiveFragment {
val newsFragment = ReceiveFragment()
val args = Bundle()
args.putParcelable(ARG_PARAM, myObject) ------**-Here i can not pass my values to onCreateView**
return newsFragment
}
}
UPADTE -1
companion object {
/**
* new instance pattern for fragment
*/
@JvmStatic
fun newInstance(myObject: List<TransactionEntity>?): ReceiveFragment {
val gson = Gson()
val model = myObject as List<TransactionEntity>
val json = gson.toJson(model)
System.out.println("json representation :" + json)
val bundle = Bundle()
bundle.putString("bundleValue", json)
val receiveFragment: ReceiveFragment = ReceiveFragment()
receiveFragment.setArguments(bundle)
return receiveFragment
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val gson = Gson()
val parsedValue = arguments!!.getString("bundleValue")
val turnsType = TypeToken<List<TransactionEntity>>() {}.type
//val animals = gson.fromJson(parsedValue,turnsType )
val animals = gson.fromJson(parsedValue, ) -------- how to get value here
并且TypeToken是错误,显示没有构造函数
答案 0 :(得分:0)
您可以像这样使用Gson()解析对象:
val parsedValue = Gson().toJson(value, object: TypeToken<StrangeType>(){}.type)
val bundle = Bundle()
bundle.putString("bundleValue", parsedValue)
val receiveFragment: ReceiveFragment = ReceiveFragment()
receiveFragment.setArguments(bundle)
,然后在您片段的onCreateView()
val parsedValue = arguments.getString("bundleValue")
val value: StrangeType = Gson().fromJson(parsedValue!!, object: TypeToken<StrangeType>(){}.type)
StrangeType
是要发送到Fragment的对象的类型。
答案 1 :(得分:0)
尝试一下:TransactionEntity必须实现Serializable
fun newInstance(myObject: ArrayList<TransactionEntity>?): ReceiveFragment {
val newsFragment = ReceiveFragment()
val args = Bundle()
args.putSerializable(ARG_PARAM, myObject)
return newsFragment
}
及之后:
arguments.getSerializable(ARG_PARAM) as ArrayList<TransactionEntity>