簡體   English   中英

如何更新 ViewPager (Kotlin) 中片段的文本視圖

[英]How to update textview of a fragment inside a ViewPager (Kotlin)

假設我在活動中有一個搜索欄來更改片段的 textview 字體大小。 我應該通過什么方法?

我有一個活動。 這包括一個視圖尋呼機。 視圖尋呼機有一個尋呼機適配器。 對於尋呼機適配器中的每個項目,我們創建片段的新實例。 當我拖動 SeekBar 時,我想將值傳遞到片段上。 我已經應用了接口回調並傳遞了參數包。 但是,在實施和測試方面,字體大小 des 不會改變。

你能告訴我如何將一個值從活動的搜索欄傳遞到尋呼機適配器內的片段嗎?

這是我的工作:

class ChapterActivity : AppCompatActivity() , ViewPager.OnPageChangeListener  {

...


        val listener =  object : SeekBar.OnSeekBarChangeListener  {
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {

                val scaledSize =  progress * 0.6 + minimumValue
                println("scaledSize : $scaledSize"  )
                println("scaledSize : ${scaledSize.toFloat()}"  )
                //txt_chapter_content.setTextSize(TypedValue.COMPLEX_UNIT_DIP, scaledSize .toFloat() );
                val prefs = getPreferences(Context.MODE_PRIVATE)
                val ed = prefs.edit()
                ed.putFloat("fontsize", scaledSize.toFloat())
                ed.apply()

                val myBundle = Bundle()
                myBundle.putFloat("fontsize" , scaledSize.toFloat() )

                        mAboutDataListener!!.onDataReceived(scaledSize.toFloat())



            }

            override fun onStartTrackingTouch(seekBar: SeekBar?) {

            }

            override fun onStopTrackingTouch(seekBar: SeekBar?) {

            }
        }



            chapterPagerAdapter = ChapterPagerAdapter(supportFragmentManager, chapters)
       // Set the Adapter and the TabLayout forward the ViewPager
            chapterViewPager.adapter = chapterPagerAdapter
            chapterViewPager.addOnPageChangeListener(this);

分段:

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout forward this fragment
        val view = inflater.inflate(com.books.learn.ddy.blinkist.R.layout.content_chapter, container, false)
        val titleTextView = view.findViewById<TextView>(R.id.txt_chapter_title)
        val contextTextView = view.findViewById<TextView>(R.id.txt_chapter_content)

contextTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, floatSize )

override fun onDataReceived(fontSize: Float) {
    contextTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, fontSize );
}

您應該在片段中實現回調接口,同時在您的活動中保留此回調的引用。 這樣,當您從您的活動中調用函數 [suppose changeFontSize()] 時,您的片段的此方法實現將被調用。 檢查這個答案

請記住,在使用 ViewPager 時,您還必須檢查當前片段的可見性。 檢查這個答案

希望這可以幫助。

如果您的 PagerAdapter 不是 FragmentStatePagerAdapter,您可以獲取您的 Fragment(例如 FragmentOne)並更新縮放大小如下:

val page = getSupportFragmentManager().findFragmentByTag("android:switcher:${R.id.pager}:${pagerPosition}"
if (page != null) {
   ((FragmentOne)page).onDataReceived(scaledSize.toFloat())   
}

如果不可行,請查看此處以了解如何在 viewpager 中獲取 Fragment 實例,然后在活動中調用它的方法。

我在這里發布了一個類似問題的答案https://stackoverflow.com/a/60427448/2102794

分段

class SampleFragment : Fragment(), BaseFragmentInteraction {
    override fun updateSeekBarProgress(progress: Int) {
        Toast.makeText(activity!!, data, Toast.LENGTH_SHORT).show()
    }
}

界面

interface BaseFragmentInteraction {
    fun updateSeekBarProgress(progress: Int)
}

SeekBar 回調:

val listener = object : SeekBar.OnSeekBarChangeListener {
    override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
        val fragmentItem = (view_pager.adapter as FragmentPagerAdapter).getItem(view_pager.currentItem)
        (fragmentItem as BaseFragmentInteraction).updateSeekBarProgress(progress)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM