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

如何自定义AppCompatActivity类以封装全局通用功能?

自定义通用AppCompatActivity基类(含全局常用功能)

下面是一个封装了隐藏软键盘、进度条控制等全局通用功能的BaseActivity,所有业务页面都可以继承这个类来复用功能:

import android.app.ProgressDialog
import android.content.Context
import android.os.Bundle
import android.view.View
import android.view.inputmethod.InputMethodManager
import android.widget.ProgressBar
import androidx.appcompat.app.AppCompatActivity

open class BaseActivity : AppCompatActivity() {
    // 布局内嵌进度条实例
    private var loadingProgressBar: ProgressBar? = null
    // Dialog式进度条实例
    private var progressDialog: ProgressDialog? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 可在此添加全局初始化逻辑,比如统一状态栏样式、全局主题配置等
    }

    /**
     * 针对指定View隐藏软键盘
     */
    fun hideKeyboard(view: View?) {
        view?.let {
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm.hideSoftInputFromWindow(it.windowToken, 0)
        }
    }

    /**
     * 全局隐藏软键盘(无需传入View)
     */
    fun hideKeyboard() {
        val targetView = currentFocus ?: window.decorView.rootView
        hideKeyboard(targetView)
    }

    /**
     * 显示布局内嵌式进度条
     * 要求布局中存在id为loading_progress的ProgressBar
     */
    fun showProgress() {
        if (loadingProgressBar == null) {
            loadingProgressBar = findViewById(R.id.loading_progress)
        }
        loadingProgressBar?.visibility = View.VISIBLE
    }

    /**
     * 隐藏布局内嵌式进度条
     */
    fun hideProgress() {
        loadingProgressBar?.visibility = View.GONE
    }

    /**
     * 显示Dialog式进度条,支持自定义提示文字
     */
    fun showProgressDialog(message: String = "加载中...") {
        if (progressDialog == null) {
            progressDialog = ProgressDialog(this).apply {
                setCancelable(false)
                setMessage(message)
            }
        }
        progressDialog?.show()
    }

    /**
     * 隐藏Dialog式进度条
     */
    fun hideProgressDialog() {
        progressDialog?.dismiss()
    }

    // ------------------- 额外通用工具方法(可选) -------------------
    /**
     * 快捷显示Toast提示
     */
    fun showToast(message: String) {
        android.widget.Toast.makeText(this, message, android.widget.Toast.LENGTH_SHORT).show()
    }

    /**
     * 销毁时清理资源,避免内存泄漏
     */
    override fun onDestroy() {
        super.onDestroy()
        progressDialog?.let {
            if (it.isShowing) it.dismiss()
            progressDialog = null
        }
        loadingProgressBar = null
    }
}

使用说明:

  • 业务Activity直接继承BaseActivity即可,比如class MainActivity : BaseActivity()
  • 隐藏软键盘:调用hideKeyboard()(全局隐藏)或hideKeyboard(editText)(针对指定输入框)
  • 进度条控制:
    • 布局内嵌式:确保布局中有android:id="@+id/loading_progress"的ProgressBar,调用showProgress()/hideProgress()
    • Dialog式:直接调用showProgressDialog("加载数据中")/hideProgressDialog()
  • 可直接使用showToast()方法快速显示提示,减少重复代码

注意事项:

  • 如果使用ViewBinding,可将loadingProgressBar的初始化替换为Binding对象的引用,避免findViewById的空指针风险
  • ProgressDialog属于过时API,若需自定义样式,可自行实现Dialog替代
  • 若在Fragment中调用软键盘隐藏方法,可在BaseFragment中封装同名方法,或通过activity as BaseActivity调用基类方法

内容的提问来源于stack exchange,提问作者user2357113

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:00:57