Как создать оповещение со скругленными углами с помощью Anko без использования XML?

#android #kotlin #anko

#Android #kotlin #anko

Вопрос:

Я хотел бы создать оповещение со скругленными углами с помощью anko, без использования какого-либо XML. Я вставил свою текущую попытку ниже. Есть ли какой-либо способ сделать пользовательский вид оповещения полностью прозрачным или сделать его закругленным и изменить цвет фона?

Белые углы

 class TestActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        alert {
            customView {
                verticalLayout {
                    backgroundDrawable = GradientDrawable().apply {
                        shape = GradientDrawable.RECTANGLE
                        cornerRadius = 15f
                        setColor(Color.BLACK)
                    }
                    for(i in 0..5){
                        textView("Hello World") {
                            textColor = Color.WHITE
                            gravity = Gravity.CENTER
                        }.lparams(matchParent,dip(50))
                    }
                }
            }
        }.show()
    }

}
  

Зависимости

 ext.kotlin_version = '1.3.21'
ext.anko_version='0.10.8'

implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0-alpha03'
implementation 'androidx.core:core-ktx:1.1.0-alpha05'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.2-alpha02'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-alpha02'

// Anko Commons
implementation "org.jetbrains.anko:anko-commons:$anko_version"

// Anko Layouts
implementation "org.jetbrains.anko:anko-sdk15:$anko_version"
// sdk15, sdk19, sdk21, sdk23 are also available
implementation "org.jetbrains.anko:anko-appcompat-v7:$anko_version"
  

Редактировать:

     var alertDialog: Dialog? = null
    alertDialog = alert {
        customView {
            verticalLayout {
                backgroundDrawable = GradientDrawable().apply {
                    shape = GradientDrawable.RECTANGLE
                    cornerRadius = 15f
                    setColor(Color.BLACK)
                }
                for(i in 0..5){
                    textView("Hello World") {
                        textColor = Color.WHITE
                        gravity = Gravity.CENTER
                    }.lparams(matchParent,dip(50))
                }
                button {
                    text = "Cancel"
                    setOnClickListener {
                        alertDialog?.dismiss()
                    }
                }
            }
        }
    }.show() as? Dialog

    // This right here does the trick
    alertDialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
    alertDialog?.show()
  

делает то, что я хочу. Спасибо, blastervla

Ответ №1:

Вы можете сделать следующее:

 val alertDialog: Dialog = alert {
    customView {
        /* Your custom view DSL */
    }
}.build() as Dialog // You can use conditional as? syntax for extra safety

// This right here does the trick
alertDialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
alertDialog.show()
  

Обратите внимание, что при этом вам нужно будет самостоятельно устанавливать заголовки и кнопки внутри contentView, поскольку в противном случае они будут отображаться на прозрачном фоне. Если вам нужна кнопка «отклонить», вы можете внести следующие изменения в объявление диалогового окна:

 var alertDialog: Dialog? = null
alertDialog = alert { 
    customView {
        /* ... */ 
        button {
            text = "Cancel"
            setOnClickListener {
                alertDialog?.dismiss()
            }
        }
    }
}.build()
/* ... */