AndroidのLogとかToastとかよく使うから短縮用のメソッドとかをActivityを継承したBaseActivityを作るのがバッドノウハウとか、ようてんさんが言ってたので、じゃあKotlinのtraitでやってみりゃいいんじゃねーの?と思ったのでやってみた。
まずはLogTraitを実装してみる。
package com.example.kotlin_trait
import android.util.Log
public trait LogTrait {
fun e(tag: String, msg: String, e: Exception? = null) {
if (e != null) {
Log.e(tag, msg, e)
} else {
Log.e(tag, msg)
}
}
fun i(tag: String, msg: String, e: Exception? = null) {
if (e != null) {
Log.i(tag, msg, e)
} else {
Log.i(tag, msg)
}
}
fun v(tag: String, msg: String, e: Exception? = null) {
if (e != null) {
Log.v(tag, msg, e)
} else {
Log.v(tag, msg)
}
}
fun d(tag: String, msg: String, e: Exception? = null) {
if (e != null) {
Log.d(tag, msg, e)
} else {
Log.d(tag, msg)
}
}
fun w(tag: String, msg: String, e: Exception? = null) {
if (e != null) {
Log.w(tag, msg, e)
} else {
Log.w(tag, msg)
}
}
}
まぁここまでは普通のTraitですよねー。
次に、ToastTraitを実装してみる。
ToastTraitは、Toastを呼び出すのですが、ToastはContextを渡さないといけないんだけど、
それどーするの?というところで悩んでたんだけど、TraitにContextを継承させればいいようだ。
Traitでクラスを継承とかできるんすねー。知らんかった。
package com.example.kotlin_trait
import android.widget.Toast
import android.content.Context
public trait ToastTrait : Context {
fun shortToast(resId : Int) {
Toast.makeText(this, resId, Toast.LENGTH_SHORT)!!.show()
}
fun shortToast(str : String) {
Toast.makeText(this, str, Toast.LENGTH_SHORT)!!.show()
}
fun longToast(resId : Int) {
Toast.makeText(this, resId, Toast.LENGTH_LONG)!!.show()
}
fun longToast(str : String) {
Toast.makeText(this, str, Toast.LENGTH_LONG)!!.show()
}
}
こうすると、Traitの中のthisは継承したクラス自身になるので、
this=Contextオブジェクトになります。
これらをActivity側で継承する。
package com.example.kotlin_trait
import android.app.Activity
import android.os.Bundle
class MyActivity() : Activity(), LogTrait, ToastTrait {
val TAG = getClass().getSimpleName()
public override fun onCreate(savedInstanceState : Bundle?) {
super<Activity>.onCreate(savedInstanceState)
setContentView(R.layout.main)
v(TAG, "v")
d(TAG, "d")
i(TAG, "i")
w(TAG, "w")
e(TAG, "e")
shortToast("トースト食べたい。")
}
}
ログは出せたし、Toastも出せた。これで勝つる。
やっぱりKotlinはいいですね。
