菜谱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
相关产品推荐
相关产品推荐

