首页 > 解决方案 > android - 如何在项目点击时用另一个替换已经打开的片段?(科特林)

问题描述

我有一个设置屏幕,它有一个 FrameLayout,它加载一个包含 RecyclerView 的片段。RecyclerView 有可选择的项目,这些项目由片段内的 onItemClick 函数处理。目标是用另一个片段替换当前打开的片段。

是否可以在 onItemClick 函数中替换当前片段?如果是这样,怎么做?

代码

用于处理 RecyclerView 和 onItemClick 函数的片段

class FragmentSettingsMain : Fragment(), AdapterSettings.OnItemClickListener {
    lateinit var settingsList: List<DataItemsSettings>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        retainInstance = true

        settingsList = listOf(
            DataItemsSettings(getString(R.string.look), getString(R.string.lookdescription), R.drawable.ic_colored_color_lens),
            DataItemsSettings(getString(R.string.playing), getString(R.string.playingdescription), R.drawable.ic_colored_view_carousel),
            DataItemsSettings(getString(R.string.images), getString(R.string.imagesdscription), R.drawable.ic_colored_image),
            DataItemsSettings(getString(R.string.audio), getString(R.string.audiodescription), R.drawable.ic_colored_volume_up),
            DataItemsSettings(getString(R.string.other), getString(R.string.otherdescription), R.drawable.ic_colored_shape),
            DataItemsSettings(getString(R.string.about), getString(R.string.aboutdescription), R.drawable.ic_colored_info)
        )
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? = inflater.inflate(R.layout.fragment_settings_main, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        rvSettings.apply {
            layoutManager = LinearLayoutManager(activity)
            adapter = AdapterSettings(settingsList, this@FragmentSettingsMain)
        }
    }

    override fun OnItemClick(position: Int) {
        when(position) {
            0 -> //NEED TO REPLACE FRAGMENT HERE
            1 -> //NEED TO REPLACE FRAGMENT HERE
            2 -> //NEED TO REPLACE FRAGMENT HERE
            3 -> //NEED TO REPLACE FRAGMENT HERE
            4 -> //NEED TO REPLACE FRAGMENT HERE
            5 -> this.startActivity(Intent(context, ActivityAbout::class.java))
        }
    }
}

FrameLayout所在的Activity

class ActivitySettings : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_settings)

        topToolbarBack.setNavigationOnClickListener {
            finish()
        }

        val frgSettingsMain = FragmentSettingsMain()

        setCurrentFragment(frgSettingsMain)

    }

    private fun setCurrentFragment(fragment: Fragment) =
        supportFragmentManager.beginTransaction().apply {
            replace(R.id.framelayoutSettings, fragment)
            commit()
        }
}

标签: androidkotlinandroid-fragments

解决方案


你可以试试这个

override fun OnItemClick(position: Int) {
        when(position) {
            0 -> addContentFragment(yourFragment(),true)
            1 -> //NEED TO REPLACE FRAGMENT HERE
            2 -> //NEED TO REPLACE FRAGMENT HERE
            3 -> //NEED TO REPLACE FRAGMENT HERE
            4 -> //NEED TO REPLACE FRAGMENT HERE
            5 -> this.startActivity(Intent(context, ActivityAbout::class.java))
        }
    }


 fun addContentFragment(fragment: androidx.fragment.app.Fragment?, addToBackStack: Boolean) {
       activity?.let {it->
           if (!it.isFinishing) {
               if (fragment == null) {
                   return
               }
               it.supportFragmentManager.let {it1->
                   val fragmentManager =it.supportFragmentManager
                   val currentFragment =
                       fragmentManager.findFragmentById(R.id.framelayoutSettings)

                   if (currentFragment != null && fragment.javaClass.isAssignableFrom(
                           currentFragment.javaClass
                       )
                   ) {
                       return
                   }

                   val fragmentTransaction = fragmentManager.beginTransaction()
               
                   fragmentTransaction.add(
                       R.id.framelayoutSettings,
                       fragment,
                       fragment.javaClass.name
                   )
                   if (addToBackStack) {
                       fragmentTransaction.addToBackStack(fragment.javaClass.name)
                   }
                  
                   fragmentTransaction.commit()

                 

               }
           }
       }
   }


推荐阅读