android widgetProvider: установить backgroundDrawable для кнопки
Я пытаюсь установить фон для кнопки (виджет homeScreen) с помощью действия конфигурации. цвет фона принимается от пользователя (из JSON) с использованием этого цвета, подготавливаются 2 GradientDrawable и добавляются в StateListDrawable. Я хочу установить это как фон для кнопки. но для RemoteViews нет метода, поддерживающего класс Drawable, и если я конвертирую drawable в BitMap, в Button нет метода, который принимает BitMap для фона.
fun configueWidget(){
val gd = GradientDrawable()
val gdPressed = GradientDrawable()
val stateDrawable = StateListDrawable()
setButtonDrawableColor(gd,gdPressed,jsonObj.getInt("color"))
stateDrawable.addState(intArrayOf(android.R.attr.state_pressed),gdPressed)
stateDrawable.addState(intArrayOf(),gd)
RemoteViews(context.packageName, R.layout.widget_layout).also { views->
views.setTextViewCompoundDrawables(R.id.widget_button,jsonObj.getInt("icon_res_id"),0,0,0)
//i want to set button background here
val intent = Intent(context,ButtonWidgetProvider::class.java)
intent.action = ButtonWidgetProvider.BUTTON_CLICK
intent.putExtra("WidgetID",widgetId)
val pendingIntent = PendingIntent.getActivity(context, widgetId, intent, 0)
views.setOnClickPendingIntent(R.id.widget_button,pendingIntent)
AppWidgetManager.getInstance(context).updateAppWidget(widgetId, views)
}
}
fun setButtonDrawableColor(drawableNormal:GradientDrawable, drawablePressed:GradientDrawable, colorInt:Int){
val red = Color.red(colorInt)
val green = Color.green(colorInt)
val blue = Color.blue(colorInt)
val newColorInt = Color.argb(0xFF,
when{red>0x80->red-0x30;else -> red+0x30},
when{green>0x80->green-0x30;else -> green+0x30},
when{blue>0x80->blue-0x30;else -> blue+0x30})
drawableNormal.colors = intArrayOf(colorInt,newColorInt)
drawableNormal.setStroke(8,newColorInt)
val pressedColorInt = Color.argb(0xFF,
when{red>0x80->red-0x20;else -> red+0x20},
when{green>0x80->green-0x20;else -> green+0x20},
when{blue>0x80->blue-0x20;else -> blue+0x20})
val pressedColorGradientInt = Color.argb(0xFF,
when{red>0x80->red-0x50;else -> red+0x50},
when{green>0x80->green-0x50;else -> green+0x50},
when{blue>0x80->blue-0x50;else -> blue+0x50})
drawablePressed.colors = intArrayOf(pressedColorInt,pressedColorGradientInt)
drawablePressed.setStroke(8,pressedColorGradientInt)
}
Есть ли способ решить эту проблему? (Я не хочу устанавливать фон из ресурса, потому что я не смогу изменить цвета)
1 ответ
Если вы хотите использовать растровое изображение в качестве фона, вам следует использовать ImageButton. Кроме того, вам вообще не нужно использовать кнопку. Вы можете использовать TextView или все, что вам нужно, для отображения вашего контента и градиента, а затем добавить к нему слушателя.