android - 覆盖 fragment 中的 setOnClickListener 停止工作

标签 android kotlin android-fragments onclicklistener

我是一名新手程序员,我的应用程序有问题。
它是一个带有 4 个 fragment 和一个 viewpager 的 Activity 。
我在每个 fragment 中有 1 个按钮,当您单击它时会执行某些操作。
当我单击 fragment 1 中的按钮并向下滚动到 fragment 4 并返回 fragment 1 时。
fragment 1 中的按钮停止工作。
如果您不单击 fragment 1 中的按钮并向下滚动到 fragment 4 并返回 fragment 1。该按钮可以正常工作。
当我单击按钮并滚动到远处的 fragment 并返回后再次单击时,就会出现问题。
主要的:

 class MainActivity : AppCompatActivity(), OnFragmentActionsListener   {
    override fun onCreate(savedInstanceState: Bundle?) {
        setTheme(R.style.AppTheme)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val fragmentAdapter = PageAdapter(this, supportFragmentManager)
        viewPager.adapter = fragmentAdapter
        val mPager: ViewPager = findViewById(R.id.viewPager)
        mPager.setPageTransformer(true, PageAdapter.ZoomOutPageTransformer())
        tablayout.setupWithViewPager(viewPager)

}
       override fun onClickFragment1btn1() {
        //here i do something when click the button like do a
            }
浏览器:
class PageAdapter  (val context: Context, fm: FragmentManager): FragmentStatePagerAdapter(fm) {
    override fun getItem(position: Int): Fragment {
        return when (position) {
            0 -> {FOne()}
            1 -> {FTwo()}
            2 -> {FThree()}
            else -> {return FFour()}
        }
    }
    override fun getCount(): Int {
        return 4
    }
    override fun getPageTitle(position: Int): CharSequence? {
        return when (position) {
            0 -> "tab1"
            1 -> "tab2"
            2 -> "tab3"
            else -> {
                return "tab4"
            }
        }
    }
界面:
interface OnFragmentActionsListener {
    //Fragment 1:
    fun onClickFragment1btn1()
    //Fragment 2:
    fun onClickFragment1btn2()
    //Fragment 3:
    fun onClickFragment1btn3()
    //Fragment 4:
    fun onClickFragment1btn4()
}
分段:
class FOne : Fragment() {
    private var listener: OnFragmentActionsListener? = null
    val TAG = "FragmentOne"
    override fun onAttach(context: Context) {
        super.onAttach(context)
        Log.d(TAG, "onAtach")
        if (context is OnFragmentActionsListener) {
            listener = context
        } else {
            throw   RuntimeException(context!!.toString() +"must implement OnFragmentInteractionListener")
        }
    }
    override fun onCreate(savedInstanceState: Bundle?){
        super.onCreate(savedInstanceState)
        Log.d(TAG, "onCreate")
    }
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View?{
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_f_one, container, false)
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        btn1.setOnClickListener{listener?.onClickFragment1btn1() }
    }
  
    override fun onDetach() {
        super.onDetach()
        listener = null
    }
}

最佳答案

最好的方法是:
方法一:
在您的 viewpager 上设置此行:

viewPager.setOffscreenPageLimit(4);
这将在您的内存中保留 4 个 fragment 。

关于android - 覆盖 fragment 中的 setOnClickListener 停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63144152/

相关文章:

java - Android - 更改ListView项目的TextStyle

android 基本认证 okhttpclient

android - Kotlin中如何使用OKHTTP发送post请求?

android - 可以在多个 Activity 中重复使用 Fragment 实例吗?

android - 恢复 Activity 时重叠 fragment

java - 如何使用 Java 类从资源 mipmap 获取图像

android - 编辑文本字段为空时禁用按钮

android - Kotlin 接口(interface)中的伴随对象

android - 无法访问 viewBinding

android - Fragment Android 中的 Backstack