如何封装通用Activity跳转按钮类 避免代码重复编写?
实现方案
你原有定义的ButtonActivity带Button构造参数不符合Android Activity组件的设计规范:Android系统会自动实例化Activity组件,仅支持调用无参构造,首先需要修正基类设计,以下是可直接运行的实现:
方案1:基类Activity封装(符合你要求的ButtonActivity实现)
import android.app.Activity import android.content.Intent import android.os.Bundle import android.widget.Button import androidx.appcompat.app.AppCompatActivity // 所有需要跳转功能的Activity都可以继承该基类 open class ButtonActivity : AppCompatActivity() { /** * 直接跳转到指定Activity * @param targetClass 目标Activity类 * @param finishCurrent 跳转完成后是否关闭当前Activity,默认false */ fun goToActivity(targetClass: Class<out Activity>, finishCurrent: Boolean = false) { val intent = Intent(this, targetClass) startActivity(intent) if (finishCurrent) finish() } /** * 给按钮绑定跳转点击事件 * @param button 要绑定点击的按钮实例 * @param targetClass 跳转目标Activity类 * @param finishCurrent 跳转完成后是否关闭当前Activity,默认false */ fun bindJumpButton(button: Button, targetClass: Class<out Activity>, finishCurrent: Boolean = false) { button.setOnClickListener { goToActivity(targetClass, finishCurrent) } } }
使用示例
MainActivity继承ButtonActivity后直接调用方法即可:
class MainActivity : ButtonActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val btnChangeScene = findViewById<Button>(R.id.btn_change_scene) // 绑定跳转事件,跳转后关闭当前MainActivity bindJumpButton(btnChangeScene, SecondActivity::class.java, finishCurrent = true) } }
SecondActivity同理继承后即可调用相同方法:
class SecondActivity : ButtonActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_second) val btnBack = findViewById<Button>(R.id.btn_back) // 绑定返回MainActivity的事件,跳转后关闭当前SecondActivity bindJumpButton(btnBack, MainActivity::class.java, finishCurrent = true) } }
方案2:全局扩展函数(更轻量,无继承成本)
如果你不想所有Activity都继承基类,可以将跳转逻辑封装为全局扩展函数,新建任意kt文件(比如Ext.kt)存放以下代码,项目所有Context子类都可以直接调用该方法,无需重复编写:
import android.app.Activity import android.content.Context import android.content.Intent fun Context.goToActivity(targetClass: Class<out Activity>, finishCurrent: Boolean = false) { val intent = Intent(this, targetClass) // 非Activity上下文调用时自动添加任务栈标识 if (this !is Activity) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } startActivity(intent) if (finishCurrent && this is Activity) { finish() } }
使用示例
任意Activity内直接调用:
// MainActivity内调用 btnChangeScene.setOnClickListener { goToActivity(SecondActivity::class.java, finishCurrent = true) } // SecondActivity内调用 btnBack.setOnClickListener { goToActivity(MainActivity::class.java, finishCurrent = true) }
内容的提问来源于stack exchange,提问作者Rafael Veiga
相关产品推荐
相关产品推荐

