【问题标题】:Fragment inside TabAdapter Refuse to Update TextViewTabAdapter 内的 Fragment 拒绝更新 TextView
【发布时间】:2025-12-29 05:00:16
【问题描述】:

我有一个超级简单的Fragment,它存在于TabAdapter 中。由于某种原因,我无法更新textViews 之一。这是它的样子。我想更新textView,上面写着“你好,主页片段”(更大的那个)。

这是我的主要活动:

class MainActivity: AppCompatActivity(){

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        setSupportActionBar(toolbar)
        getSupportActionBar()?.hide();


        view_pager.adapter = TabsAdapter(supportFragmentManager)

        tab_layout.setupWithViewPager(view_pager)

    }
}

这是我的 TabsAdapter:

class TabsAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager) {

    private val fragmentTitles = arrayOf("Home", "Music", "Map")

    override fun getItem(position: Int): Fragment {
        when (position) {
            0 ->
                return HomeFragment()
            1 ->
                return MusicFragment()
            2 ->
                return MapFragment()
            else ->
                return HomeFragment()
        }
    }
    // Return the number of views/fragments available.
    override fun getCount(): Int = 3 // in our case 3 fragments
    // Return title based on position
    override fun getPageTitle(position: Int): CharSequence {
        return fragmentTitles[position]
    }
}

这是我的 HomeFragment():

class HomeFragment : Fragment() {

    var weathermainView: TextView?=null

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


        val view = inflater!!.inflate(R.layout.fragment_home, container, false)

        val weathermainView = view.findViewById<TextView>(R.id.textweathermain)



        println("***********************************************")
        println("value of weathermainView in onCreateView BEFORE setting: " + weathermainView?.text)
        println("***********************************************")
        weathermainView.setText("YOLO DAWG")
        println("***********************************************")
        println("value of weathermainView in onCreateView AFTER setting: " + weathermainView?.text)
        println("***********************************************")
        return inflater!!.inflate(R.layout.fragment_home, container, false)
    }
}

所以选项卡肯定会循环,但是当我启动模拟器时,这是输出:

I/System.out: ***********************************************
I/System.out: value of weathermainView in onCreateView BEFORE setting: hello there home fragment
I/System.out: ***********************************************
I/System.out: ***********************************************
I/System.out: value of weathermainView in onCreateView AFTER setting: YOLO DAWG
I/System.out: ***********************************************

但是

主屏幕没有改变,尽管它说 textView.text 的值应该不同。我已经仔细检查了 textView 项目是否是我的布局包中的正确项目。我也尝试在 onViewCreated 生命周期钩子中设置文本,但这似乎也不起作用。

这真的不应该这么难。我已经在 * 和文档中寻找了几天,尽我所能告诉你这是你应该这样做的方式。任何帮助将不胜感激。

【问题讨论】:

  • 那么,您想在更改选项卡时更改文本吗?
  • 是的!我已经弄清楚如何(最终)通过 TabsAdapter 通过 newInstance 发送数据。但是在我完成所有设置后,我发现我什至根本无法更新 textView 的值。我不知道为什么这会这么难。

标签: android kotlin android-tablayout


【解决方案1】:

更改您的方法以返回 view 而不是再次将其膨胀为

class HomeFragment : Fragment() {

    var weathermainView: TextView?=null

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


        val view = inflater!!.inflate(R.layout.fragment_home, container, false)

        val weathermainView = view.findViewById<TextView>(R.id.textweathermain)



        println("***********************************************")
        println("value of weathermainView in onCreateView BEFORE setting: " + weathermainView?.text)
        println("***********************************************")
        weathermainView.setText("YOLO DAWG")
        println("***********************************************")
        println("value of weathermainView in onCreateView AFTER setting: " + weathermainView?.text)
        println("***********************************************")
        return view //< --- do this
    }
}

【讨论】:

  • 我以为你想在更改标签时更新片段,哈哈