▪️

共通Activityを作ってみた

2024/06/01に公開

どういうものか

AppCompatActivityを拡張したActivity

何ができるか

キーボード表示/非表示、ダイアログ、ナビゲーションバー表示/非表示などをまとめたActivity。

詳細

実装

open class UICommonActivity : AppCompatActivity() {
    companion object{
        /** ログタグ */
        private val LOG_TAG = "UICommonActivity"
        /** ヘッダー上部の余白 */
        private val HEADER_TOP_PADDING = 25
    }

    // 多重起動防止用
    private var isProcessing = false
    private val processingHandler = Handler()
    private val runnable = Runnable { isProcessing = false }

    /**
     * 多重起動防止のための判定関数.
     *
     * @return 現在Activity起動中かどうかを返却
     */
    open fun isProcessing(): Boolean {
        if (isProcessing) {
            return true
        }
        // 現在Activity起動中ではないため、trueに変更
        isProcessing = true
        // 1秒後にフラグを落とす
        processingHandler.postDelayed(runnable, 1000)
        return false
    }

    /**
     * ステータスバー取得
     *
     * @return ステータスバーの高さ
     */
    open fun getStatusBarHeight(): Int {
        var windowMetrics: WindowMetrics? = null
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            windowMetrics = windowManager.currentWindowMetrics
            val insets =
                windowMetrics.windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars())
            insets.top
        } else {
            val dp = resources.displayMetrics.density
            (HEADER_TOP_PADDING * dp).toInt()
        }
    }

    /**
     * 可能であればキーボードを閉じる
     */
    protected open fun hideKeyboard() {
        val inputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
        inputMethodManager.hideSoftInputFromWindow(
            window.decorView.rootView.windowToken,
            InputMethodManager.HIDE_NOT_ALWAYS
        )
    }

    /**
     * ナビゲーションバーを非表示にする
     */
    open fun hideNavigationBar() {
        UICommonActivity.hideNavigationBar(this)
    }

    /**
     * ナビゲーションバーを非表示にする
     */
    open fun hideNavigationBar(activity: Activity) {
        // 表示時にシステムUIのバー非表示を設定する
        activity.window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
    }

    /**
     * メイン画面へ遷移する
     *
     * @param isFinish 自身のアクティビティを終了するか
     * true:終了する
     */
    open fun startMain(isFinish: Boolean) {
        Logging.d(
            LOG_TAG,
            "startMain isFinish:$isFinish"
        )
        val intent = Intent(this, MainActivity::class.java)
        intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
        startActivity(intent)
        if (isFinish) {
            finish()
        }
    }

    /**
     * リストダイアログ表示
     * @param titleId タイトルのリソースID
     * @param itemList 表示するリスト
     * @param itemListener アイテム押下時の動作
     * @param cancelListener キャンセルボタン押下時の動作
     */
    open fun showListDialog(
        titleId: Int, itemList: List<String>,
        itemListener: DialogInterface.OnClickListener?,
        cancelListener: DialogInterface.OnClickListener?
    ) {
        val builder = AlertDialog.Builder(this)
        val cs = itemList.toTypedArray<CharSequence>()
        builder.setItems(cs, itemListener).setTitle(titleId)
            .setNegativeButton(R.string.commonPopUp_Cancel, cancelListener)
        val dialog = builder.create()
        dialog.window!!.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
        dialog.show()
    }

    /**
     * エラーダイアログ表示
     * @param titleId タイトルのリソースID
     * @param messageId メッセージのリソースID
     * @param clickListener OKボタン押下時の動作
     */
    open fun showErrorDialog(
        titleId: Int, messageId: Int,
        clickListener: DialogInterface.OnClickListener?
    ) {
        val builder = AlertDialog.Builder(this)
        builder.setMessage(messageId).setTitle(titleId)
            .setPositiveButton(R.string.commonPopUp_OK,
                DialogInterface.OnClickListener { dialogInterface, i ->
                    clickListener?.onClick(
                        dialogInterface,
                        i
                    )
                })
        val dialog = builder.create()
        dialog.window!!.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
        dialog.show()
    }

    /**
     * 確認ダイアログ表示
     * @param title タイトル
     * @param message メッセージ
     * @param OKClickListener OKボタン押下時の動作
     * @param CancelClickListener OKボタン押下時の動作
     */
    open fun showConfirmDialog(
        title: String?, message: String?,
        OKClickListener: DialogInterface.OnClickListener?,
        CancelClickListener: DialogInterface.OnClickListener?
    ) {
        val builder = AlertDialog.Builder(this)
        builder.setMessage(message).setTitle(title)
            .setPositiveButton(R.string.commonPopUp_OK) { dialogInterface, i ->
                OKClickListener?.onClick(dialogInterface, i)
            }
            .setNegativeButton(R.string.commonPopUp_Cancel) { dialogInterface, i ->
                CancelClickListener?.onClick(dialogInterface, i)
            }
        builder.setCancelable(false)
        val dialog = builder.create()
        dialog.window!!.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
        dialog.show()
    }
}

利用例

class ReloadActivity : UICommonActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
...
    }
}

Discussion