Котлин для 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()
}
Другие вопросы по тегам