Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android widgetProvider:为按钮设置backgroundDrawable_Android_Button_Kotlin_Appwidgetprovider_Background Drawable - Fatal编程技术网

android widgetProvider:为按钮设置backgroundDrawable

android widgetProvider:为按钮设置backgroundDrawable,android,button,kotlin,appwidgetprovider,background-drawable,Android,Button,Kotlin,Appwidgetprovider,Background Drawable,我试图通过配置活动为按钮(主屏幕小部件)设置背景。 接受用户提供的背景色(来自JSON) 使用该颜色,准备2个GradientDrawable并添加到StateListDrawable中。 我想将此设置为按钮的背景。但对于RemoteView,并没有支持Drawable类的方法,若我将Drawable转换为位图,那个么按钮中并没有接受位图作为背景的方法 fun configueWidget(){ val gd = GradientDrawable() val gdPressed

我试图通过配置活动为按钮(主屏幕小部件)设置背景。 接受用户提供的背景色(来自JSON) 使用该颜色,准备2个GradientDrawable并添加到StateListDrawable中。 我想将此设置为按钮的背景。但对于RemoteView,并没有支持Drawable类的方法,若我将Drawable转换为位图,那个么按钮中并没有接受位图作为背景的方法

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)
}

有办法解决这个问题吗?(我不想从资源中设置背景,因为我将无法更改颜色)

如果您想要位图作为背景,应该使用ImageButton。而且你根本不需要使用按钮。你可以使用文本视图或任何你需要的东西来显示你的内容和渐变,然后在其中添加一个侦听器。

即使我使用文本视图或图像按钮,我也无法设置我想要的背景,我还想设置文本和图标,但这些都很容易实现。