Как передать данные из PageAdapter во фрагмент? - PullRequest
0 голосов
/ 26 июня 2019

Я пишу очень простое приложение в Android, но у меня проблема с передачей данных во фрагмент.

У меня есть TabLayout с ViewPager.

Этот 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 голосов
/ 26 июня 2019

Вы можете использовать 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-адрес во фрагменте.

0 голосов
/ 26 июня 2019

Способ конструктора: использование конструктора для передачи данных:

 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)

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...