我有一个带集合的小部件(这很重要!)。它看起来像这样:
我的代码基于官方Android文档:Android App Widgets。
因此,对于小部件,我使用StackView集合中的自定义对象集合。此集合由StackRemoteViewsFactory处理(实现RemoteViewsService.RemoteViewsFactory)。 正如您所看到的,每个项目都有三个ImageButtons和一个TextView。
我知道如何为整个RemoteView项添加onClick行为。 这在官方文档中有描述。
但是我的每个视图(按钮和textview)都需要四个onClick行为。
我的问题: 对于具有RemoteView集合的窗口小部件中的每个StackView项,是否可以对Click具有不同的视图?
现在我没有看到任何可能性如何:(
更新:
我想在onClicks中使用与此问题类似的内容:Processing more than one button click at Android Widget。但是,由于小部件实现的差异,来自该问题的解决方案不适用于具有RemoteView集合的小部件。
答案 0 :(得分:1)
如果您已经看过StackView小部件示例代码,您知道有提供程序类和服务类。在服务类中,尝试使用Intent(包括“命令字”)将setOnClickFillInIntent添加到stackview布局的每个id。在provider类中将setPendingIntentTemplate设置为示例代码。这是重要的部分,在提供者类中,有OnReceive()。 setPendingIntentTemplate将发送Intent,其中包括您在Provider类中设置的特定操作和从服务类设置的每个id值的“comman word”。那么现在你知道用户从Stack View小部件中点击了哪个按钮。 如果您还需要进一步的提示,请告诉我我将添加示例代码。
答案 1 :(得分:0)
所以基本上你必须做两件事才能将 onClick 行为添加到 Android App Widget 中 StackView/ListView 中的按钮。
在实现 RemoteViewService.RemoteServiceFactory 的 StackRemoteViewsFactory 的 getViewAt 函数中, 为要添加功能的 id 添加一个 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.
在扩展 AppWidgetProvider 的 WidgetProvider 类的 onUpdate 函数中, 添加一个 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
}
}