Установить события onClick внутри элементов виджета StackView
У меня есть виджет с коллекцией (это важно!). Это выглядит так:
Я основал свой код на официальной документации Android: виджеты приложений для Android.
Поэтому для виджета я использую коллекцию с пользовательскими объектами внутри коллекции StackView. Эта коллекция обрабатывается StackRemoteViewsFactory (реализует RemoteViewsService.RemoteViewsFactory). И, как вы можете видеть, каждый элемент имеет три кнопки ImageButton и один TextView.
Я знаю, как добавить поведение onClick для всего элемента RemoteView. Это описано в официальных документах.
Но мне нужно четыре поведения onClick для каждого из моих просмотров (кнопок и просмотра текста).
Мой вопрос: возможно ли иметь разные представления onClicks для каждого элемента StackView в виджете с коллекцией RemoteView?
Сейчас я не вижу никаких возможностей, как это:(
ОБНОВИТЬ:
Я хочу иметь что-то похожее с onClicks, как в этом вопросе: Обрабатывать более одного нажатия кнопки в Android Widget. Но решение этого вопроса не работает для виджетов с коллекцией RemoteViews из-за различий в реализациях виджетов.
2 ответа
Если вы видели пример кода виджета StackView, вы знаете, что есть класс провайдера и класс обслуживания. В классе обслуживания попробуйте добавить setOnClickFillInIntent к каждому идентификатору макета стека с Intent, включая "командное слово". и в классе провайдера установите setPendingIntentTemplate в качестве примера кода. это важная часть, в классе провайдера есть OnReceive(). setPendingIntentTemplate будет отправлять Intent, включая две вещи, которые определенное действие, которое вы установили в классе Provider, и "коммандное слово", установленное для каждого идентификатора слоя из класса обслуживания. теперь вы знаете, какую кнопку нажимали пользователи из виджета Stack View. Если вам нужны дополнительные советы для этого, скажите мне, я добавлю пример кода.
Итак, в основном вам нужно сделать 2 вещи, чтобы добавить поведение onClick к кнопке в StackView / ListView в виджете приложения Android.
В функции getViewAt StackRemoteViewsFactory, которая реализует RemoteViewService.RemoteServiceFactory, добавьте setOnClickFillingIntent() для идентификатора, который вы хотите добавить функцию. например.
RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget__fan); Bundle extras = new Bundle(); extras.putInt(TestWidget.EXTRA_ITEM, position); Intent fillInIntent = new Intent(); fillInIntent.putExtras(extras); rv.setOnClickFillInIntent(R.id.fan_status, fillInIntent); // id of button you want to add a onClick function to.
В вашей функции onUpdate класса WidgetProvider, который расширяет AppWidgetProvider, добавьте setPendingIntentTemplate (). например.
Intent toastIntent = new Intent(context, TestWidget.class); toastIntent.setAction(TestWidget.act1); toastIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); PendingIntent toastPendingIntent = PendingIntent.getBroadcast(context, 0, toastIntent,PendingIntent.FLAG_UPDATE_CURRENT); rv.setPendingIntentTemplate(R.id.lview, toastPendingIntent);
Теперь действие было установлено для этой конкретной кнопки (в моем случае R.id.fan_status). Вы можете добавить его функциональные возможности в функцию onRecieve (). например.
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(act1)) {
// Add your functionalities
}
}