Android Kotlin 将数据从 viewpager 的基本片段传递到其选项卡片段之一
Android Kotlin pass data from base fragment of a viewpager to one of its tab fragment
所以在这种情况下,我有一个片段充当包含两个选项卡的 viewpager 的基本片段。我想要做的是将信息从基本片段传递到其中一个选项卡片段。
这是基本片段的片段代码
BaseFragment.kt
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val args = arguments?.let { SwitchingHistoryDetailFragmentArgs.fromBundle(it) }
val selectedOrderId = args?.orderId //This variable is the one that i want to pass.
// Set action bar title to "Main Dashboard"
(activity as AppCompatActivity).supportActionBar?.title = "Switching History Details"
val binding: FragmentSwitchingHistoryDetailBinding = DataBindingUtil.inflate(inflater,
R.layout.fragment_switching_history_detail, container, false)
Log.i("History", "Selected History: $selectedOrderId")
binding.viewpagerMain.adapter =
MyPagerAdapter((activity as AppCompatActivity).supportFragmentManager)
binding.tabsMain.setupWithViewPager(viewpager_main)
return binding.root
}
如你所见,我要传递的变量是selectedOrderId
。这是我要将该信息传递到的选项卡片段:
DetailFragment.kt
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Binding object for this fragment and the layout
binding = DataBindingUtil.inflate(inflater,
R.layout.fragment_switching_history_detail_tab, container, false)
....
....
....
//Return.... i don't know.
return binding.root
}
这是我正在使用的 PagerAdapter:
MyPagerAdapter.kt
class MyPagerAdapter(fm: FragmentManager): FragmentStatePagerAdapter(fm){
// sebuah list yang menampung objek Fragment
private val pages = listOf(
DetailFragment(), <- This is where i want to pass the information into
DetailFragment2()
)
// menentukan fragment yang akan dibuka pada posisi tertentu
override fun getItem(position: Int): Fragment {
return pages[position]
}
override fun getCount(): Int {
return pages.size
}
// judul untuk tabs
override fun getPageTitle(position: Int): CharSequence? {
return when(position){
0 -> "Details"
else -> "Previous Changes"
}
}
}
我对 viewPager 还很陌生。我尝试使用 Intent 但不起作用。有没有办法做到这一点?如果有任何细节我想指出,请随时询问。
简单的方法是将 selectedOrderId
传递到适配器中,如下所示:
binding.viewpagerMain.adapter =
MyPagerAdapter((activity as AppCompatActivity).supportFragmentManager,selectedOrderId)
然后将该 orderId 从 PagerAdapter
传递给片段构造函数,如下所示:
class MyPagerAdapter(fm: FragmentManager,val orderId : String): FragmentStatePagerAdapter(fm){
// sebuah list yang menampung objek Fragment
private val pages = listOf(
DetailFragment.getInstance(orderId), <- This is where i want to pass the information into
DetailFragment2()
)
// menentukan fragment yang akan dibuka pada posisi tertentu
override fun getItem(position: Int): Fragment {
return pages[position]
}
override fun getCount(): Int {
return pages.size
}
// judul untuk tabs
override fun getPageTitle(position: Int): CharSequence? {
return when(position){
0 -> "Details"
else -> "Previous Changes"
}
}
}
您的详细信息片段如下所示:
class DetailFragment : Fragment() {
private var orderId: String? = null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Binding object for this fragment and the layout
binding = DataBindingUtil.inflate(inflater,
R.layout.fragment_switching_history_detail_tab, container, false)
if (arguments != null) {
orderId = arguments?.getString("orderId")
}
// do whatever you want to do with this variable
return binding.root
}
companion object {
/**
* Method used to get the instance of the fragment.
*
* @return fragment instance
*/
@JvmStatic
fun getInstance(orderId: String): DetailFragment {
val fragment = DetailFragment()
val bundle = Bundle()
bundle.putString("orderId", orderId)
fragment.arguments = bundle
return fragment
}
}
}
如果您对此有任何疑问,请告诉我。编码愉快 :)
所以在这种情况下,我有一个片段充当包含两个选项卡的 viewpager 的基本片段。我想要做的是将信息从基本片段传递到其中一个选项卡片段。
这是基本片段的片段代码
BaseFragment.kt
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val args = arguments?.let { SwitchingHistoryDetailFragmentArgs.fromBundle(it) }
val selectedOrderId = args?.orderId //This variable is the one that i want to pass.
// Set action bar title to "Main Dashboard"
(activity as AppCompatActivity).supportActionBar?.title = "Switching History Details"
val binding: FragmentSwitchingHistoryDetailBinding = DataBindingUtil.inflate(inflater,
R.layout.fragment_switching_history_detail, container, false)
Log.i("History", "Selected History: $selectedOrderId")
binding.viewpagerMain.adapter =
MyPagerAdapter((activity as AppCompatActivity).supportFragmentManager)
binding.tabsMain.setupWithViewPager(viewpager_main)
return binding.root
}
如你所见,我要传递的变量是selectedOrderId
。这是我要将该信息传递到的选项卡片段:
DetailFragment.kt
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Binding object for this fragment and the layout
binding = DataBindingUtil.inflate(inflater,
R.layout.fragment_switching_history_detail_tab, container, false)
....
....
....
//Return.... i don't know.
return binding.root
}
这是我正在使用的 PagerAdapter:
MyPagerAdapter.kt
class MyPagerAdapter(fm: FragmentManager): FragmentStatePagerAdapter(fm){
// sebuah list yang menampung objek Fragment
private val pages = listOf(
DetailFragment(), <- This is where i want to pass the information into
DetailFragment2()
)
// menentukan fragment yang akan dibuka pada posisi tertentu
override fun getItem(position: Int): Fragment {
return pages[position]
}
override fun getCount(): Int {
return pages.size
}
// judul untuk tabs
override fun getPageTitle(position: Int): CharSequence? {
return when(position){
0 -> "Details"
else -> "Previous Changes"
}
}
}
我对 viewPager 还很陌生。我尝试使用 Intent 但不起作用。有没有办法做到这一点?如果有任何细节我想指出,请随时询问。
简单的方法是将 selectedOrderId
传递到适配器中,如下所示:
binding.viewpagerMain.adapter =
MyPagerAdapter((activity as AppCompatActivity).supportFragmentManager,selectedOrderId)
然后将该 orderId 从 PagerAdapter
传递给片段构造函数,如下所示:
class MyPagerAdapter(fm: FragmentManager,val orderId : String): FragmentStatePagerAdapter(fm){
// sebuah list yang menampung objek Fragment
private val pages = listOf(
DetailFragment.getInstance(orderId), <- This is where i want to pass the information into
DetailFragment2()
)
// menentukan fragment yang akan dibuka pada posisi tertentu
override fun getItem(position: Int): Fragment {
return pages[position]
}
override fun getCount(): Int {
return pages.size
}
// judul untuk tabs
override fun getPageTitle(position: Int): CharSequence? {
return when(position){
0 -> "Details"
else -> "Previous Changes"
}
}
}
您的详细信息片段如下所示:
class DetailFragment : Fragment() {
private var orderId: String? = null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Binding object for this fragment and the layout
binding = DataBindingUtil.inflate(inflater,
R.layout.fragment_switching_history_detail_tab, container, false)
if (arguments != null) {
orderId = arguments?.getString("orderId")
}
// do whatever you want to do with this variable
return binding.root
}
companion object {
/**
* Method used to get the instance of the fragment.
*
* @return fragment instance
*/
@JvmStatic
fun getInstance(orderId: String): DetailFragment {
val fragment = DetailFragment()
val bundle = Bundle()
bundle.putString("orderId", orderId)
fragment.arguments = bundle
return fragment
}
}
}
如果您对此有任何疑问,请告诉我。编码愉快 :)