在片段中覆盖 setOnClickListener 停止工作

override setOnClickListener in a fragment stop working

我是一名新手程序员,我的应用程序有问题。

它是一个 activity,包含 4 个带有 viewpager 的片段。 我在每个片段中都有 1 个按钮,当您单击它时会执行某些操作。

当我单击片段 1 中的按钮并向下滚动到片段 4 并返回到片段 1 时。 片段 1 中的按钮停止工作。

如果您不单击片段 1 中的按钮并向下滚动到片段 4 并返回到片段 1。该按钮工作正常。

当我单击按钮并滚动到远处的片段并 return 我再次单击时出现问题。

主要:

 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
            }

viewpager:

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 个片段。

Ankit 谢谢。

对于查看此错误的人。 问题出在 savedInstance 中。 该按钮工作正常,但带有信息的 2 edittext 在 onDestroy 之后不采用新值。 使用按钮的操作适用于保存的实例(我在更改页面之前在第一次操作中输入的值)

对于我的应用程序,setOffscreenPageLimit 非常完美,因为它只有 4 个片段。 如果你有更多的页面可能会导致内存不足。

Android 开发者回答: “” open fun setOffscreenPageLimit(limit: Int): Unit 设置在空闲状态下应保留在视图层次结构中当前页面任一侧的页面数。超出此限制的页面将在需要时从适配器重新创建。

这是作为优化提供的。如果您事先知道需要支持的页面数量或在页面上设置了延迟加载机制,则调整此设置可以提高分页动画和交互的感知流畅度。如果您有少量页面 (3-4) 可以同时保持活动状态,则当用户来回翻页时,用于新创建的视图子树的布局将花费更少的时间。 ""

修复我应用中的 kotlin:

 //PageAdapter Starts
        val fragmentAdapter = PageAdapter(this, supportFragmentManager)
        viewPager.adapter = fragmentAdapter
        val mPager: ViewPager = findViewById(R.id.viewPager)
        mPager.offscreenPageLimit = 4 <--- solution
        mPager.setPageTransformer(true, PageAdapter.ZoomOutPageTransformer())
        tablayout.setupWithViewPager(viewPager)
        //Page Adapter ends