在StackView小部件项中设置onClick事件

时间:2012-07-23 12:58:45

标签: android android-widget widget onclick stackview

我有一个带集合的小部件(这很重要!)。它看起来像这样:

Android widget screenshot

我的代码基于官方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集合的小部件。

2 个答案:

答案 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 中的按钮。

  1. 在实现 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.
    
  2. 在扩展 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
    }
}