如何将数据从PageAdapter传递到Fragment?

时间:2019-06-26 16:15:41

标签: android android-fragments kotlin

我正在用Android编写一个非常简单的应用程序,但是在将数据传递到片段时遇到了问题。

我有一个带有ViewPager的TabLayout。

此TabLayout显示两个片段。一个片段是静态的,按照我的意图是硬编码的。第二个片段包含一个ImageView,它显示一张优惠券图像。

我希望CouponFragemnt显示从PagerAdapter传递到此片段的图像,但我不知道该怎么做。

使用什么以及如何使用?捆绑包,其他?

我在将图像发布到StackOverflow上没有太多声誉,但是您可以在这里查看:https://i.imgur.com/Dc27bQM.png

PageAdapter()

class ViewPagerAdapter( fm: FragmentManager, private val numberOfFrags: Int) : FragmentStatePagerAdapter(fm) {
    override fun getItem(position: Int): Fragment? {
        when (position) {
            0 -> return HowToUseFragment()
            1 -> return CouponFragment() // I want to pass data, which tells fragment what image to display.
        }
        return null
    }

    override fun getCount(): Int {
        return numberOfFrags
    }

    override fun getPageTitle(position: Int): CharSequence? {
        when (position) {
            0 -> return "Jak używać?"
            1 -> return "Hamburger"
        }
        return super.getPageTitle(position)
    }
}

CouponFragment()

class CouponFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        // Inflate the layout for this fragment
        val viewOfLayout = inflater.inflate(R.layout.fragment_coupon, container, false)

        if (Build.VERSION.SDK_INT >= 21) {
            viewOfLayout.coupon_IMGV.setImageDrawable(resources.getDrawable(R.drawable.coupon_hamburger, null))
        }
        else {
            viewOfLayout.coupon_IMGV.setImageDrawable(resources.getDrawable(R.drawable.coupon_hamburger))
        }
        return viewOfLayout
    }
}

2 个答案:

答案 0 :(得分:0)

构造方法:使用构造方法传递数据:

 class CouponFragment(val imageId:Int) : Fragment() { // or any data you want 


    override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

    // Inflate the layout for this fragment
    val viewOfLayout = inflater.inflate(R.layout.fragment_coupon, container, false)

    if (Build.VERSION.SDK_INT >= 21) {
        viewOfLayout.coupon_IMGV.setImageDrawable(resources.getDrawable(R.drawable.coupon_hamburger, null))
    }
    else {
        viewOfLayout.coupon_IMGV.setImageDrawable(resources.getDrawable(R.drawable.coupon_hamburger))
    }
    return viewOfLayout
}

}

...

  when (position) {
        0 -> return HowToUseFragment()
        1 -> return CouponFragment(R.id.your_awesome_image) 
    }

捆绑方式:

class CouponFragment:Fragment(){


  ...


companion object {
    const val DATA_KEY= "name"

    fun newInstance(imageId: Int): CouponFragment{
        val fragment = CouponFragment().apply{

       arguments =  Bundle().apply {
            putInt(DATA_KEY, imageId)
        }

     }

        return fragment
    }
}

    ...



    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val yourAwesomeImage = arguments?.getInt(DATA_KEY)
    // ...
}

如何使用它:

 when (position) {
        0 -> return HowToUseFragment()
        1 -> return CouponFragment.newInstance(R.id.you_awesome_image)

    }

答案 1 :(得分:0)

您可以在应用程序运行时使用appSession来保存数据。因此,创建一个AppSession类以保存图像资源。

class AppSession {

private var instance: AppSession? = null
@Synchronized
fun getInstance(): AppSession {
    if (instance == null) {
        instance = AppSession()
    }
    return instance as AppSession
}

fun setInstance(instance: AppSession) {
    AppSession().instance = instance
}
public var imageUrl:String?=null
//use this to save the image resource as per your code }

您可以调用AppSession().getInstance().imageUrl来设置适配器中的图像资源,然后调用AppSession().getInstance().imageUrl来获取片段中的URL。