当前位置: 首页 > 知识库问答 >
问题:

Kotlin:更新viewPager中的片段

江宏深
2023-03-14

我正在考虑一个简单的例子,包括以下部分:

  • Main活动:有编辑文本、按钮、viewPager
  • 碎片A:什么都没有
  • 碎片B:有文本视图

所以,在屏幕上,你可以滑动查看每个片段。我希望我的例子有这样一个功能:如果一个人在editText中写了一个文本,然后点击按钮,它就会出现在片段B中。

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

主要活动。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()
        }
    }

}

片段dapter.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)
    }
}

碎片。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)
    }
}

碎片B。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
    }
}

共有1个答案

彭修筠
2023-03-14

目前,片段B片段列表中,因此您可以像片段列表[片段B位置]一样检索它。然后在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
    }
}
 类似资料:
  • 下面是: 这是我要用于向中添加项的方法

  • 我尝试使用onTabSelected来检测某个片段何时被选中,然后在接口的帮助下从该片段启动一个方法(下面的代码)。 但是,当使用Start方法时,在尝试更新TextView时会激发NullPointerException。start方法的代码是: 在以下行抛出异常: 是的,我已经在网上查过了所有可用的东西,但似乎没有任何东西对我有用。 非常感谢您的帮助!

  • 我痛苦了3天。我正在使用兼容性库中的视图分页程序。我已经成功地让它显示了几个视图。我的问题是,当我交换视图时,不会在它的回收器视图中按片段更新数据。但当我关闭应用程序时,打开碎片会按回收器视图显示更新内容。我使用了所有方法,如setnotifydatachanged()和许多其他方法,但viewpager中的片段不更新内容。感谢所有的帮助,这是我的主要活动

  • 当我从listview中添加或删除一个项目时,listview不会更新,除非我在viewpager中滚动到屏幕外,然后返回,在片段中再次触发OnCreate方法。这是基于eclipse中的viewpager模板的,我只是在片段中添加了一个listview,而不仅仅是一个textview。将notifyDataSetChanged放置到片段中没有帮助,也没有向片段中添加OnResume。以下是主要活