如何通过 ID 打开特定 activity
How to open specific activity via ID
我有一个匹配的项目。在项目中,我使用了房间数据库。我的数据库中有三个记录,它们有一个 ID 并包含字段 imgTeamOne、imgTeamTwo、titleTeamOne、titleTeamTwo、itemDate。我为每个匹配项(ActivityDetailOne、ActivityDetailTwo、ActivityDetailThree)准备了特定的 activity,我希望当我点击第一张卡片时 - ActivityDetailOne 打开,当我点击第二张卡片时 - ActivityDetailTwo 打开,等等。我该怎么做呢?如何写一段代码让ID=0的卡片打开ActivityDetailOne,求助。我是初学者,看不懂
FragmentMatch.kt
class FragmentMatch : Fragment() {
private lateinit var _binding: FragmentMatchBinding
private val binding get() = _binding
private val matchViewModel: ViewModelMatch by activityViewModels()
private lateinit var recyclerView: RecyclerView
private var adapter: RecyclerAdapter? = RecyclerAdapter(emptyList())
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentMatchBinding.inflate(inflater, container, false)
recyclerView = binding.passRecyclerView
recyclerView.layoutManager =
LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false)
recyclerView.adapter = adapter
requireActivity().title = "Игры"
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
matchViewModel.matchListLiveData.observe(
viewLifecycleOwner,
Observer { receipts -> receipts?.let { updateUI(receipts) } }
)
}
private fun updateUI(matches: List<MatchModel>) {
if (matches.isEmpty()){
initialDb()
}
adapter = RecyclerAdapter(matches)
recyclerView.adapter = adapter
}
private fun initialDb(){
val match = MatchModel(UUID.randomUUID(), "25 сентября 2021", "Chelsea", "Manchester City")
val match2 = MatchModel(UUID.randomUUID(), "25 сентября 2021", "Everton", "Norvich City")
val match3 = MatchModel(UUID.randomUUID(), "25 сентября 2021", "Brentford", "Liverpool")
matchViewModel.addMatch(match)
matchViewModel.addMatch(match2)
matchViewModel.addMatch(match3)
}
private inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
View.OnClickListener {
private lateinit var match: MatchModel
private val titleTeamOne: TextView = itemView.findViewById(R.id.titleTeamOne)
private val imgTeamOne: ImageView = itemView.findViewById(R.id.imgTeamOne)
private val titleTeamTwo: TextView = itemView.findViewById(R.id.titleTeamTwo)
private val imgTeamTwo: ImageView = itemView.findViewById(R.id.imgTeamTwo)
private val dateGame: TextView = itemView.findViewById(R.id.dateGame)
private val favBtn: Button = itemView.findViewById(R.id.favBtn)
private val btnDetail: Button = itemView.findViewById(R.id.btnDetail)
init {
itemView.setOnClickListener(this)
}
fun bind(match: MatchModel) {
this.match = match
titleTeamOne.text = (match.firstCommand)
titleTeamTwo.text = (match.secondCommand)
dateGame.text = (match.date)
when (match.firstCommand) {
"Everton" -> {
imgTeamOne.setImageResource(R.drawable.image_3)
}
"Brentford" -> {
imgTeamOne.setImageResource(R.drawable.image_4)
}
"Norwich" -> {
imgTeamOne.setImageResource(R.drawable.image_5)
}
"Liverpool" -> {
imgTeamOne.setImageResource(R.drawable.image_6)
}
}
when (match.secondCommand) {
"Everton" -> {
imgTeamTwo.setImageResource(R.drawable.image_3)
}
"Brentford" -> {
imgTeamTwo.setImageResource(R.drawable.image_4)
}
"Norwich" -> {
imgTeamTwo.setImageResource(R.drawable.image_5)
}
"Liverpool" -> {
imgTeamTwo.setImageResource(R.drawable.image_6)
}
}
favBtn.setOnClickListener {
val match = MatchModel(match.id, match.date, match.firstCommand, match.secondCommand, true)
matchViewModel.saveMatch(match)
}
btnDetail.setOnClickListener {
val intent = Intent(context, DetailActivity::class.java)
startActivity(intent)
}
}
override fun onClick(v: View) {
}
}
private inner class RecyclerAdapter(private var matches: List<MatchModel>) :
RecyclerView.Adapter<MyViewHolder>() {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): MyViewHolder {
val itemView =
LayoutInflater.from(parent.context)
.inflate(R.layout.item_match, parent, false)
return MyViewHolder(itemView)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val match = matches[position]
holder.bind(match)
}
override fun getItemCount() = matches.size
}
}
我会在房间数据库中打开一个新字段,例如“val type: Int”并检查类型以打开新的 activity。但在我看来,您只能创建一个 activity 并使其对每个匹配项通用
因为我最初不想在数据库中创建一个单独的字段,所以我在 ID 字段中使用了 UUID.randomUUID() - 这使我的工作变得复杂,所以我编写了检查命令名称的代码并使用此命令打开 activity。这不太正确,但如果您在代码中使用不具有随机性的 ID,则可以按 ID 进行检查。这是我做的解决方案:
btnDetail.setOnClickListener {
if (match.firstCommand == "Chelsea") {
val intent = Intent(context, DetailActivity::class.java)
startActivity(intent)
}else if (match.firstCommand == "Everton"){
val intent = Intent(context, SecondDetailActivity::class.java)
startActivity(intent)
}else if(match.firstCommand== "Brentford"){
val intent = Intent(context, ThirdDetailActivity::class.java)
startActivity(intent)
}
我有一个匹配的项目。在项目中,我使用了房间数据库。我的数据库中有三个记录,它们有一个 ID 并包含字段 imgTeamOne、imgTeamTwo、titleTeamOne、titleTeamTwo、itemDate。我为每个匹配项(ActivityDetailOne、ActivityDetailTwo、ActivityDetailThree)准备了特定的 activity,我希望当我点击第一张卡片时 - ActivityDetailOne 打开,当我点击第二张卡片时 - ActivityDetailTwo 打开,等等。我该怎么做呢?如何写一段代码让ID=0的卡片打开ActivityDetailOne,求助。我是初学者,看不懂
FragmentMatch.kt
class FragmentMatch : Fragment() {
private lateinit var _binding: FragmentMatchBinding
private val binding get() = _binding
private val matchViewModel: ViewModelMatch by activityViewModels()
private lateinit var recyclerView: RecyclerView
private var adapter: RecyclerAdapter? = RecyclerAdapter(emptyList())
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentMatchBinding.inflate(inflater, container, false)
recyclerView = binding.passRecyclerView
recyclerView.layoutManager =
LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false)
recyclerView.adapter = adapter
requireActivity().title = "Игры"
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
matchViewModel.matchListLiveData.observe(
viewLifecycleOwner,
Observer { receipts -> receipts?.let { updateUI(receipts) } }
)
}
private fun updateUI(matches: List<MatchModel>) {
if (matches.isEmpty()){
initialDb()
}
adapter = RecyclerAdapter(matches)
recyclerView.adapter = adapter
}
private fun initialDb(){
val match = MatchModel(UUID.randomUUID(), "25 сентября 2021", "Chelsea", "Manchester City")
val match2 = MatchModel(UUID.randomUUID(), "25 сентября 2021", "Everton", "Norvich City")
val match3 = MatchModel(UUID.randomUUID(), "25 сентября 2021", "Brentford", "Liverpool")
matchViewModel.addMatch(match)
matchViewModel.addMatch(match2)
matchViewModel.addMatch(match3)
}
private inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
View.OnClickListener {
private lateinit var match: MatchModel
private val titleTeamOne: TextView = itemView.findViewById(R.id.titleTeamOne)
private val imgTeamOne: ImageView = itemView.findViewById(R.id.imgTeamOne)
private val titleTeamTwo: TextView = itemView.findViewById(R.id.titleTeamTwo)
private val imgTeamTwo: ImageView = itemView.findViewById(R.id.imgTeamTwo)
private val dateGame: TextView = itemView.findViewById(R.id.dateGame)
private val favBtn: Button = itemView.findViewById(R.id.favBtn)
private val btnDetail: Button = itemView.findViewById(R.id.btnDetail)
init {
itemView.setOnClickListener(this)
}
fun bind(match: MatchModel) {
this.match = match
titleTeamOne.text = (match.firstCommand)
titleTeamTwo.text = (match.secondCommand)
dateGame.text = (match.date)
when (match.firstCommand) {
"Everton" -> {
imgTeamOne.setImageResource(R.drawable.image_3)
}
"Brentford" -> {
imgTeamOne.setImageResource(R.drawable.image_4)
}
"Norwich" -> {
imgTeamOne.setImageResource(R.drawable.image_5)
}
"Liverpool" -> {
imgTeamOne.setImageResource(R.drawable.image_6)
}
}
when (match.secondCommand) {
"Everton" -> {
imgTeamTwo.setImageResource(R.drawable.image_3)
}
"Brentford" -> {
imgTeamTwo.setImageResource(R.drawable.image_4)
}
"Norwich" -> {
imgTeamTwo.setImageResource(R.drawable.image_5)
}
"Liverpool" -> {
imgTeamTwo.setImageResource(R.drawable.image_6)
}
}
favBtn.setOnClickListener {
val match = MatchModel(match.id, match.date, match.firstCommand, match.secondCommand, true)
matchViewModel.saveMatch(match)
}
btnDetail.setOnClickListener {
val intent = Intent(context, DetailActivity::class.java)
startActivity(intent)
}
}
override fun onClick(v: View) {
}
}
private inner class RecyclerAdapter(private var matches: List<MatchModel>) :
RecyclerView.Adapter<MyViewHolder>() {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): MyViewHolder {
val itemView =
LayoutInflater.from(parent.context)
.inflate(R.layout.item_match, parent, false)
return MyViewHolder(itemView)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val match = matches[position]
holder.bind(match)
}
override fun getItemCount() = matches.size
}
}
我会在房间数据库中打开一个新字段,例如“val type: Int”并检查类型以打开新的 activity。但在我看来,您只能创建一个 activity 并使其对每个匹配项通用
因为我最初不想在数据库中创建一个单独的字段,所以我在 ID 字段中使用了 UUID.randomUUID() - 这使我的工作变得复杂,所以我编写了检查命令名称的代码并使用此命令打开 activity。这不太正确,但如果您在代码中使用不具有随机性的 ID,则可以按 ID 进行检查。这是我做的解决方案:
btnDetail.setOnClickListener {
if (match.firstCommand == "Chelsea") {
val intent = Intent(context, DetailActivity::class.java)
startActivity(intent)
}else if (match.firstCommand == "Everton"){
val intent = Intent(context, SecondDetailActivity::class.java)
startActivity(intent)
}else if(match.firstCommand== "Brentford"){
val intent = Intent(context, ThirdDetailActivity::class.java)
startActivity(intent)
}