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
        }
    }
}

如果您对此有任何疑问,请告诉我。编码愉快 :)