android-如何用另一个单击项目替换已经打开的片段? (科特琳)

时间:2020-09-08 17:46:35

标签: android kotlin android-fragments

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

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

代码

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

g++ (GCC) 10.2.1 20200723 (Red Hat 10.2.1-1)

FrameLayout所在的活动

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))
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您可以尝试

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()

                 

               }
           }
       }
   }