Котлин для Android. Тост
В разных примерах Kotlin для Android я вижу toast ("Некоторое сообщение...") или toastLong("Некоторое длинное сообщение"). Например:
view.setOnClickListener { toast("Click") }
Как я понимаю, это функция расширения для деятельности.
Как определить эту функцию toast () и где (в каком месте) ее можно использовать в рамках проекта?
18 ответов
Это может быть функция расширения для Context
:
fun Context.toast(message: CharSequence) =
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
Вы можете разместить это в любом месте вашего проекта, где именно ваше дело. Например, вы можете определить файл mypackage.util.ContextExtensions.kt
и поместите его в качестве функции верхнего уровня.
Всякий раз, когда у вас есть доступ к Context
Например, вы можете импортировать эту функцию и использовать ее:
import mypackage.util.ContextExtensions.toast
fun myFun(context: Context) {
context.toast("Hello world!")
}
Это одно строчное решение в Котлине:
Toast.makeText(this@MainActivity, "Its toast!", Toast.LENGTH_SHORT).show()
На самом деле это часть Anko, расширение для Kotlin. Синтаксис выглядит следующим образом:
toast("Hi there!")
toast(R.string.message)
longToast("Wow, such a duration")
На уровне вашего приложения build.gradle
, добавлять implementation "org.jetbrains.anko:anko-common:0.8.3"
добавлять import org.jetbrains.anko.toast
к вашей деятельности.
Попробуй это
В деятельности
Toast.makeText(applicationContext, "Test", Toast.LENGTH_LONG).show()
или же
Toast.makeText(this@MainActiivty, "Test", Toast.LENGTH_LONG).show()
Во фрагменте
Toast.makeText(activity, "Test", Toast.LENGTH_LONG).show()
Если вы не хотите использовать anko
и хотите создать свой собственный Toast
расширение. Вы можете создавать встроенные (или без встроенных) расширения, определенные в файле kotlin (без класса), и с этим вы можете получить доступ к этой функции в любом классе.
inline fun Context.toast(message:String){
Toast.makeText(this, message , duration).show()
}
Применение:
В действии,
toast("Toast Message")
Во фрагменте,
context?.toast("Toast Message")
Очень простое расширение.
Добавьте это в файл toast.kt
import android.content.Context
import android.widget.Toast
import androidx.fragment.app.Fragment
inline fun Context.toast(message:()->String){
Toast.makeText(this, message() , Toast.LENGTH_LONG).show()
}
inline fun Fragment.toast(message:()->String){
Toast.makeText(this.context, message() , Toast.LENGTH_LONG).show()
}
тогда у тебя будет
toast {
"Hello World"
}
как в фрагменте, так и в действии.
С помощью этой функции расширения для тостов вы можете вызывать их как в действиях, так и во фрагментах, вы можете передать это какContext
для мероприятий или getApplication()
для фрагментов, также он создается с помощью Toast.LENGTH_SHORT
по умолчанию, поэтому вам не нужно беспокоиться о том, чтобы передать его как параметр, но вы также можете перезаписать его, если вам нужно.
Котлин
fun Context.toast(context: Context = applicationContext, message: String, duration: Int = Toast.LENGTH_SHORT){
Toast.makeText(context, message , duration).show()
}
Применение
toast(this, "John Doe")
если вы хотите перезаписать продолжительность.
toast(this, "John Doe", Toast.LENGTH_LONG)
При использовании Anko с Kotlin, внутри фрагмента используйте либо:
- activity.toast ("строковое сообщение") или
- context.toast("строковое сообщение")
Android Toast для Kotlin
Деятельность
Toast.makeText(applicationContext, "message...", Toast.LENGTH_SHORT).show()
Фрагмент
Toast.makeText(activity, "message...", Toast.LENGTH_SHORT).show()
Я нашел очень простой способ тоста по данной ссылке https://gist.github.com/felipearimateia/ee651e2694c21de2c812063980b89ca3. В этой ссылке Activity используется вместо Context. Попытайся.
Показывать тост не из потока пользовательского интерфейса, а во фрагменте
activity?.runOnUiThread {
Toast.makeText(context, "Image saved to the Gallery", Toast.LENGTH_SHORT).show()
}
Вот расширение тоста за активность или фрагмент
fun showToast(context: Context,@StringRes string : Int, duration: Int = Toast.LENGTH_SHORT){
Toast.makeText(context,string,duration).show()
}
inline fun Context.toast(message:()->String){
Toast.makeText(this, message() , Toast.LENGTH_LONG).show()
}
inline fun Fragment.toast(message: () -> String, duration: () -> Int = { Toast.LENGTH_LONG }){
Toast.makeText(this.context,message(),duration()).show()
}
inline fun AppCompatActivity.toast(message: () -> String, duration: () -> Int = { Toast.LENGTH_LONG }){
Toast.makeText(this.applicationContext,message(),duration()).show()
}
Если вам нужен простой тост, просто вызовите первый метод как фрагмент, так и действие
showToast(yourContext,"your message") or showToast(yourContext,"your message",1200L)
Или
toast {
"Your message"
}
Или
toast({"your message"}) or toast({"your messge"},{your duration = 1200L})
Скачать исходный код можно здесь ( Custom Toast In Android Kotlin)
fun Toast.createToast(context: Context, message: String, gravity: Int, duration: Int, backgroucolor: String, imagebackgroud: Int) {
val inflater: LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
/*first parameter is the layout you made
second parameter is the root view in that xml
*/
val layout = inflater.inflate(R.layout.custom_toast, (context as Activity).findViewById(R.id.custom_toast_container))
layout.findViewById(R.id.tv_message).text = message
layout.setBackgroundColor(Color.parseColor(backgroucolor))
layout.findViewById(R.id.iv_image).iv_image.setImageResource(imagebackgroud)
setGravity(gravity, 0, 100)
setDuration(Toast.LENGTH_LONG);
setView(layout);
show()
}
Спасибо!
Это просто функция расширения для Context
(как и другие уже отмеченные).
В Anko вы можете найти множество предопределенных функций расширения для Android, что, вероятно, также используется во многих руководствах.
Как я использую это просто создавая Object
/Class
object UtilKotlin {
fun showMessage(context: Context, message: String) {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}
}
и вызов метода
UtilKotlin.showMessage(activity, "Sets 0 !") // in activity trying this
Просто добавьте ответ @nhaarman -> вы, вероятно, хотите добавить resourceId
поддержка также
fun Context.toast(resourceId: Int) = toast(getString(resourceId))
fun Context.toast(message: CharSequence) =
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
Для Jetpack Compose используйте «контекст» из пакета «androidx.compose.runtime».
Toast.makeText(context, "Its a toast!", Toast.LENGTH_SHORT).show()
Пользовательский тост с цветом фона Размер текста И файл XML не завышен Попробуйте код без настройки цвета фона
fun theTOAST(){
val toast = Toast.makeText(this@MainActivity, "Use View Person List",Toast.LENGTH_LONG)
val view = toast.view
view.setBackgroundColor(Color.TRANSPARENT)
val text = view.findViewById(android.R.id.message) as TextView
text.setTextColor(Color.BLUE)
text.textSize = (18F)
toast.show()
}