Kotlin:更新 viewPager 中的片段

Kotlin: update fragment in viewPager

我正在考虑一个包含以下组件的简单示例:

因此,在屏幕中,您可以滑动以查看每个片段。我希望我的示例具有以下功能:如果在 editText 中写入文本并单击按钮,那么它会显示在 Fragment B 中。

A 尝试使用 notifyDatsetChanged() 但它不起作用。有人能帮忙吗?下面是我的全部代码:

MainActivity.kt

package com.myproject.chapterfivesectionone

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.myproject.chapterfivesectionone.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    lateinit var fragmentB: FragmentB

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        val fragmentList = listOf(FragmentA(), FragmentB())
        val adapter = FragmentAdapter(this)
        adapter.fragmentList = fragmentList
        binding.viewPager.adapter = adapter

        binding.buttonSend.setOnClickListener {
            var bundle = Bundle()
            bundle.putString("key1", binding.editTextWriteSomething.text.toString())
            fragmentB.arguments = bundle

            adapter.notifyDataSetChanged()
        }
    }

}

FragmentAdapter.kt

package com.myproject.chapterfivesectionone

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.adapter.FragmentStateAdapter

class FragmentAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity) {
    var fragmentList = listOf<Fragment>()

    override fun getItemCount(): Int {
        return fragmentList.size
    }

    override fun createFragment(position: Int): Fragment {
        return fragmentList.get(position)
    }
}

FragmentA.kt

package com.myproject.chapterfivesectionone

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

class FragmentA : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_a, container, false)
    }
}

FragmentB.kt

package com.myproject.chapterfivesectionone

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.myproject.chapterfivesectionone.databinding.FragmentBBinding

class FragmentB : Fragment() {
    lateinit var binding: FragmentBBinding

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentBBinding.inflate(inflater, container, false)
        if (arguments?.getString("key1") != null) {
            binding.textViewInFragmentB.text = arguments?.getString("key1")
        }
        return binding.root
    }
}

目前,fragmentBfragmentList 中,因此您可以像 fragmentList[fragmentBPosition] 一样检索它。然后在 FragmentB 中定义一个函数来更新 TextView

binding.buttonSend.setOnClickListener {
    (fragmentList[1] as FragmentB).updateTheTextView("new")
    // if you want code more clean, can replace hard code value by a constant or you can write some logic to find FragmentB from fragmentList
}

片段B

class FragmentB : Fragment() {
    fun updateTheTextView(newText : String) {
          binding.textViewInFragmentB.text = newText
    }
}