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

如何封装通用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:06:03