Предоставление метода щелчка для виджетов

#android-studio #kotlin #widget #click #appwidgetprovider

Вопрос:

Я попытался создать виджет, и мне это удалось, но как я могу удовлетворить потребности в щелчках инструментов в виджете?

То, о чем я говорю, — это не перенаправление на действие, я ищу метод, с помощью которого я могу создать функцию.

Файл макета, используемый для виджета ниже

 <RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    android:id="@ id/kare"
    android:theme = "@style/Theme.Mytwo.AppWidgetContainer" >

    <Button
        android:id = "@ id/appwidget_text"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:layout_centerInParent = "true"
        android:background = "#048018"
        android:text = "clean"
        android:textSize = "24sp"
        android:padding="15dp"
        android:textStyle = "bold" />

</RelativeLayout >
 

Это мой класс поставщика виджетов

 class NewAppWidget : AppWidgetProvider() {

    override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { // There may be multiple widgets active, so update all of them
        for (appWidgetId in appWidgetIds) {
            updateAppWidget(context, appWidgetManager, appWidgetId)
        }
    }
}

internal fun updateAppWidget(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int) {

    val views = RemoteViews(context.packageName, R.layout.new_app_widget )

    appWidgetManager.updateAppWidget(appWidgetId, views)
}
 

И, наконец, мой файл с информацией о поставщике

 <appwidget-provider xmlns:android = "http://schemas.android.com/apk/res/android"
    android:description = "@string/app_widget_description"
    android:initialKeyguardLayout = "@layout/new_app_widget"
    android:initialLayout = "@layout/new_app_widget"
    android:minWidth = "100dp"
    android:minHeight = "40dp"
    android:previewImage = "@drawable/ic_launcher_foreground"
    android:previewLayout = "@layout/new_app_widget"
    android:resizeMode = "horizontal|vertical"
    android:targetCellWidth = "2"
    android:targetCellHeight = "2"
    android:updatePeriodMillis = "86400000"
    android:widgetCategory = "home_screen" />
 

Ответ №1:

Я не уверен, что вы подразумеваете под «созданием функции». Единственный способ заставить что-то произойти при нажатии на виджет-это через RemoteViews#setOnCheckedChangeResponse или RemoteViews#setOnClickFillInIntent или RemoteViews#setOnClickPendingIntent или RemoteViews#setOnClickResponse . Помимо вызова RemoteViews.RemoteResponse#addSharedElement , все , что может сделать любой из них, — это послать сигнал Intent , который может запустить Activity или пробудить сигнал BroadcastReceiver .

Вы не можете выполнить свой собственный код внутри виджета: любой код, который вы хотите выполнить в ответ на щелчок по виджету, должен быть в Activity или BroadcastReceiver . Это не обязательно должно быть Activity или BroadcastReceiver внутри приложения, создавшего виджет, хотя обычно так и будет.

Поскольку RemoteViews он создан внутри вашего приложения AppWidgetProvider#updateAppWidget , вы можете добавить его в appWidgetId качестве дополнительного PendingIntent , чтобы определить, на какой виджет был нажат.