#android #kotlin #kotlin-extension
#Android #kotlin #kotlin-расширение
Вопрос:
Код A является функцией расширения для Context
, Fragment
и Activity
.
Я думаю, что это избыточно, как я могу это оптимизировать?
Код A
fun Context.toast(msg: String){
Toast.makeText(this, msg, Toast.LENGTH_LONG).show()
}
fun Context.toast(@StringRes resId: Int){
toast(getString(resId))
}
fun Context.toast(@StringRes resId: Int,msg: String){
toast(getString(resId) msg)
}
fun Context.toast(msg: String,@StringRes resId: Int){
toast(msg getString(resId))
}
//------------------------------------------------
fun Fragment.toast(msg:String) {
requireContext().toast(msg)
}
fun Fragment.toast(@StringRes resId: Int) {
toast(requireContext().getString(resId))
}
fun Fragment.toast(@StringRes resId: Int, msg: String) {
toast(requireContext().getString(resId) msg)
}
fun Fragment.toast( msg: String, @StringRes resId: Int) {
toast(msg requireContext().getString(resId))
}
//------------------------------------------------
fun Activity.toast(msg: String){
Toast.makeText(this, msg, Toast.LENGTH_LONG).show()
}
fun Activity.toast(@StringRes resId: Int){
toast(getString(resId))
}
fun Activity.toast(@StringRes resId: Int,msg: String){
toast(getString(resId) msg)
}
fun Activity.toast(msg: String,@StringRes resId: Int){
toast(msg getString(resId))
}
Комментарии:
1. вам не нужно реализовывать функции расширения для
Activity
, посколькуActivity
расширяетContext
Ответ №1:
Функций расширения контекста должно быть достаточно. Вы сможете использовать его практически в любом месте, где доступен компонент пользовательского интерфейса.
Мы можем удалить расширения для, Activity
потому что Activity
это косвенный подкласс Context
class.
И мы также можем удалить Fragment
расширения, потому что они бесполезны, пока фрагмент не будет присоединен к действию (которое является контекстом).
fun Context.toast(msg: String){
Toast.makeText(this, msg, Toast.LENGTH_LONG).show()
}
fun Context.toast(@StringRes resId: Int){
toast(getString(resId))
}
fun Context.toast(@StringRes resId: Int,msg: String){
toast(getString(resId) msg)
}
fun Context.toast(msg: String,@StringRes resId: Int){
toast(msg getString(resId))
}
Эти функции могут быть использованы в действии:
И во фрагменте. Логически правильно и преднамеренно, что мы должны сначала получить ссылку на Context
:
Комментарии:
1. requireContext () может вызвать исключение IllegalStateException, если фрагмент не прикреплен!
2. @ArpitJ. Правильно. Это указано в документации к этому методу: developer.android.com/reference/androidx/fragment/app /… .