You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

菜谱APP开发:如何将40个相似Activity整合为单页承载不同数据?

用单一通用Activity搞定40个菜谱页面的高效方案

嘿,兄弟,你完全没必要搞40个重复的Activity——这不仅复制粘贴累,以后改个布局或者逻辑要改40次,想想都头大!咱们直接用「单一通用Activity + 数据驱动UI」的方案,一次性解决重复代码的问题,还方便维护。

下面一步步给你讲怎么实现:

1. 先定义菜谱的数据模型

首先把每个菜谱的可变数据(图片、时长、食材这些)封装成一个数据类,相当于给每个菜谱建个"数据模板"。用Kotlin的话超级简单,加个@Parcelize注解就能方便地在Activity之间传递:

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class Recipe(
    val id: Int,
    val name: String,
    val imageResId: Int, // 本地图片用资源ID,网络图就换成String存URL
    val cookTime: String, // 比如"30分钟"
    val ingredients: List<String>,
    // 要是有步骤、小贴士这些,直接加字段就行
) : Parcelable

(Java的话让类实现Serializable或者Parcelable接口就行,逻辑是一样的)

2. 创建一个通用的RecipeActivity

只需要做一个Activity,布局里放好所有固定的控件:显示图片的ImageView、显示时长的TextView、显示食材的TextView(或者用RecyclerView展示食材列表)。然后在onCreate里接收传递过来的菜谱数据,把数据填充到对应控件里就行:

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

        // 从Intent里拿到传递的菜谱数据
        val recipe = intent.getParcelableExtra<Recipe>("EXTRA_RECIPE") ?: return

        // 把数据填充到UI上
        iv_recipe_image.setImageResource(recipe.imageResId)
        tv_recipe_name.text = recipe.name
        tv_cook_time.text = recipe.cookTime
        
        // 处理食材列表,比如转成带符号的字符串显示
        val ingredientsText = recipe.ingredients.joinToString("\n- ")
        tv_ingredients.text = "- $ingredientsText"
    }
}

布局文件activity_recipe.xml就按你想要的固定布局写一次就行,不用重复写40遍!

3. 集中管理所有菜谱数据

把40个菜谱的数据集中放到一个地方,比如用一个单例对象存起来,以后要改数据直接在这改,不用找各个Activity:

object RecipeRepository {
    val allRecipes = listOf(
        Recipe(
            id = 1,
            name = "番茄炒蛋",
            imageResId = R.drawable.tomato_egg,
            cookTime = "15分钟",
            ingredients = listOf("番茄2个", "鸡蛋3个", "盐1勺", "糖半勺")
        ),
        Recipe(
            id = 2,
            name = "红烧肉",
            imageResId = R.drawable.braised_pork,
            cookTime = "60分钟",
            ingredients = listOf("五花肉500g", "八角2个", "生抽3勺", "老抽1勺")
        ),
        // 剩下的38个菜谱依次往这里加就行
    )
}

4. 跳转时传递对应菜谱数据

不管你是从首页的列表还是分类页跳转,只需要拿到对应的Recipe对象,通过Intent传给通用的RecipeActivity就行:

// 比如在RecyclerView的点击事件里
val selectedRecipe = RecipeRepository.allRecipes[position]
val intent = Intent(this, RecipeActivity::class.java)
intent.putExtra("EXTRA_RECIPE", selectedRecipe)
startActivity(intent)

额外优化建议

  • 如果以后菜谱数据要从网络加载,或者存在本地数据库(比如Room),只需要修改RecipeRepository里的数据来源就行,通用Activity完全不用动
  • 要是食材列表很长,建议用RecyclerView展示,比TextView拼接字符串更美观,滚动也方便
  • 可以给通用Activity加个加载状态,比如数据没传过来时显示个占位符

这种方案的核心就是把可变的数据和固定的UI分离,让一个Activity适配所有菜谱场景,彻底告别重复代码,维护起来轻松太多!

内容的提问来源于stack exchange,提问作者newbieCoder.pkg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:18:18