【问题标题】:How do I switch from one fragment to another when a list item is clicked?单击列表项时如何从一个片段切换到另一个片段?
【发布时间】:2019-06-27 05:44:26
【问题描述】:

我在“所有用户”片段中有一个列表。单击列表上的名称时,它应该切换到“用户详细信息”片段。我似乎无法找到一种方法来以某种方式破坏此片段并显示新片段,或者只是在旧片段之上显示新片段。

使用的语言是 Kotlin。我是新手。我尝试了片段管理器的一些方法,但似乎无法找出正确的语法。

主要活动.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //Default view when app starts
        title = resources.getString(R.string.allusers)
        loadFragment(AllUsersFragment())

        //Bottom Navigation Bar
        navigationView.setOnNavigationItemSelectedListener {
            when (it.itemId) {
                R.id.navigation_allusers -> {
                    title = resources.getString(R.string.allusers)
                    loadFragment(AllUsersFragment())
                    return@setOnNavigationItemSelectedListener true
                }

                R.id.navigation_transfer -> {
                    title = resources.getString(R.string.transfer)
                    loadFragment(TransferFragment())
                    return@setOnNavigationItemSelectedListener true
                }

                R.id.navigation_logs -> {
                    title = resources.getString(R.string.logs)
                    loadFragment(LogsFragment())
                    return@setOnNavigationItemSelectedListener true
                }

            }
            false

        }
    }

    //function to load fragment when bottom navigation is clicked

    fun loadFragment(fragment: Fragment) {
        val transaction = supportFragmentManager.beginTransaction()
        transaction.replace(R.id.container, fragment)
        transaction.addToBackStack(null)
        transaction.commit()
    }

}

AllUsersFragment.kt

class AllUsersFragment : Fragment(){

    private lateinit var listView:ListView

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val rootView = inflater.inflate(R.layout.fragment_allusers, container, false)
        val details = UserDetailsFragment()
        val bundle = Bundle()                //To transfer information

        listView = rootView.findViewById(R.id.usersList)

        val userNames = arrayOf(
            "Andrew Jackson",
            "Barry Alan",
            "Caitlyn Snow",
            "Drake Ramoray"
        )

        val adapter = ArrayAdapter(context, android.R.layout.simple_list_item_1, userNames)
        listView.adapter = adapter

        //List view item clicked listener
        listView.onItemClickListener = AdapterView.OnItemClickListener { adapterView, view, i, l ->

            val userName = userNames[i]
            bundle.putString("str", userName)
            bundle.putInt("int", i)
            details.arguments = bundle
        }

        return rootView
    }
}

UserDetails.kt

class UserDetailsFragment : Fragment(){
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val rootView =  inflater.inflate(R.layout.fragment_user_details,container,false)

        val nameField = rootView.findViewById<TextView>(R.id.nameField)
        val imageField = rootView.findViewById<ImageView>(R.id.imageField)

        //Importing images
        val andrewjackson = BitmapFactory.decodeResource(context!!.resources,R.drawable.andrewjackson)
        val barryalan = BitmapFactory.decodeResource(context!!.resources,R.drawable.barryalan)
        val caitlynsnow = BitmapFactory.decodeResource(context!!.resources,R.drawable.caitlynsnow)
        val drakeramoray = BitmapFactory.decodeResource(context!!.resources,R.drawable.drakeramoray)

        val userImages = ArrayList<Bitmap>()

        userImages.add(andrewjackson)
        userImages.add(barryalan)
        userImages.add(caitlynsnow)
        userImages.add(drakeramoray)

        val name = arguments!!.getString("str")     //Displays name clicked on Details Page
        nameField.setText(name)

        val i =arguments!!.getInt("int")               //Displays image of user from array
        imageField.setImageBitmap(userImages[i])

        return rootView
    }
}

我认为在MainActivity.kt 中使用loadFragment 函数可能是可行的,但我想不出在片段中使用它的方法。

预期输出:

当列表中的一个名字被点击时,它应该变成同一个容器中的另一个片段,显示用户详细信息。

【问题讨论】:

    标签: android android-fragments kotlin


    【解决方案1】:

    您可以在片段中使用此代码来替换容器中的片段

    val someFragment = YourUserDetailsFragment()
    val transaction = fragmentManager!!.beginTransaction()
    transaction.replace(R.id.container, someFragment)
    transaction.addToBackStack(null)
    transaction.commit()
    

    【讨论】:

      【解决方案2】:

      是的,有两种方法使用接口和公共方法。由于您的片段与活动绑定,这意味着它是父活动。

      因此您可以访问该方法只是为了使公共不活动和访问使用

      (activity as MainActivity).loadFragment(//Your fragment intance)
      

      Here 是 Activity 和 Fragment 之间通信的示例。

      【讨论】:

        【解决方案3】:

        你已经在你的点击监听器中设置好了所有东西,你应该打电话给activity?.loadFragment(UserDetailsFragment())

         listView.onItemClickListener = AdapterView.OnItemClickListener { adapterView, view, i, l ->
                val userName = userNames[i]
                bundle.putString("str", userName)
                bundle.putInt("int", i)
                details.arguments = bundle
                (activity as MainActivity)?.loadFragment(details)
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-20
          • 2022-01-25
          • 2018-05-17
          • 1970-01-01
          • 2015-10-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多