代码之家  ›  专栏  ›  技术社区  ›  Peter Weyand

TabAdapter中的片段拒绝更新TextView

  •  0
  • Peter Weyand  · 技术社区  · 8 年前

    我有一个超级简单的 Fragment 存在于 TabAdapter . 由于某种原因,我无法更新 textViews . 这是它的样子。我想更新 textView 上面写着“hello there home fragment”(大一点的)。

    enter image description here

    以下是我的主要活动:

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

    这是我的标签:

    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项目在我的layouts包中是否正确。我还尝试在onViewCreated生命周期挂钩中设置文本,但这似乎也不起作用。

    这真的不应该这么难。我已经在stackoverflow和文档中查找了好几天了,我只能说这是您应该采用的方式。任何帮助都将不胜感激。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Rajan Kali    8 年前

    更改方法以返回 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
        }
    }