▪️
共通Activityを作ってみた
どういうものか
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