Android代码复用咨询:多Activity中重写方法的代码复用方案
解决Android多Activity复用通用重写方法的几种方案
哈哈,这个问题真的太接地气了——谁没被重复写onBackPressed()、onOptionsItemSelected()这类方法烦过!我来给你几个实用的方案,都是Android开发里常用的代码复用思路:
1. 基类Activity(最经典的复用方案)
这是最直接的思路:创建一个通用基类Activity,把所有Activity都需要的通用逻辑写在里面,其他业务Activity直接继承这个基类就行。
比如先写一个BaseActivity:
// 用Kotlin示例,Java写法逻辑一致 abstract class BaseActivity : AppCompatActivity() { override fun onBackPressed() { // 这里写你的通用返回逻辑,比如: if (supportFragmentManager.backStackEntryCount > 0) { supportFragmentManager.popBackStack() } else { super.onBackPressed() } } override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { android.R.id.home -> { onBackPressed() // 复用返回逻辑 true } else -> super.onOptionsItemSelected(item) } } }
然后你的业务Activity直接继承它:
class HomeActivity : BaseActivity() { // 只需要写当前Activity特有的逻辑就行,通用方法不用重复写 // 如果某个Activity需要特殊的返回逻辑,直接重写onBackPressed()覆盖基类即可 override fun onBackPressed() { // 这里写当前Activity的特殊逻辑 // 比如弹窗确认退出 AlertDialog.Builder(this) .setMessage("确定要退出吗?") .setPositiveButton("确定") { _, _ -> super.onBackPressed() } .setNegativeButton("取消", null) .show() } }
2. 委托模式(灵活的组合式复用)
如果你的项目里已经有了其他基类,或者不想用继承的方式(毕竟Java/Kotlin是单继承),可以用委托模式把通用逻辑封装到独立的类里,让Activity去委托调用。
比如封装一个返回逻辑的处理类:
class BackPressedHandler(private val activity: AppCompatActivity) { fun handleBackPressed() { // 通用返回逻辑 if (activity.supportFragmentManager.backStackEntryCount > 0) { activity.supportFragmentManager.popBackStack() } else { activity.finish() } } fun handleOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { android.R.id.home -> { handleBackPressed() true } else -> false } } }
然后在Activity里使用:
class SettingsActivity : AppCompatActivity() { private val backHandler = BackPressedHandler(this) override fun onBackPressed() { backHandler.handleBackPressed() } override fun onOptionsItemSelected(item: MenuItem): Boolean { return backHandler.handleOptionsItemSelected(item) || super.onOptionsItemSelected(item) } }
这种方式的好处是灵活,你可以给不同的Activity搭配不同的处理类,也可以在需要的时候替换逻辑。
3. Kotlin扩展函数(简洁的语法糖)
如果你的项目用Kotlin开发,扩展函数是个非常方便的选择——不用继承,不用额外类,直接给AppCompatActivity扩展通用方法:
fun AppCompatActivity.setupCommonBackBehavior() { onBackPressedDispatcher.addCallback(this) { // 通用返回逻辑 if (supportFragmentManager.backStackEntryCount > 0) { supportFragmentManager.popBackStack() } else { finish() } } supportActionBar?.setDisplayHomeAsUpEnabled(true) } // 然后在Activity的onCreate里调用: class ProfileActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_profile) setupCommonBackBehavior() } override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { android.R.id.home -> { onBackPressed() true } else -> super.onOptionsItemSelected(item) } } }
如果想把菜单逻辑也一起封装,同样可以写个扩展函数处理onOptionsItemSelected。
内容的提问来源于stack exchange,提问作者Asif Mushtaq
相关产品推荐
相关产品推荐

