Android:可点击的图像视图小部件

Posted

技术标签:

【中文标题】Android:可点击的图像视图小部件【英文标题】:Android: Clickable imageview widget 【发布时间】:2011-11-24 17:20:25 【问题描述】:

我想做一个非常简单的小部件:

它必须只包含一个图像视图

1) 在收到的短信上,它应该改变图像

2)点击它也应该改变图像

我尝试使用 ImageButton 制作它,但失败了:在收到短信事件时更改图像时出现问题:新图像的比例错误。

无论如何,现在我想制作一个没有其他任何东西的 ImageView。

问题是我无法处理 onClick 事件:

我有一个正在运行的服务,它应该处理所有事件:收到短信并点击:

小部件提供者:

public class MyWidgetProvider extends AppWidgetProvider 
    @Override
    public void onDisabled(Context context) 
        context.stopService(new Intent(context, UpdateService.class));
        super.onDisabled(context);
    

    @Override
    public void onEnabled(Context context) 
        super.onEnabled(context);
        Intent intent = new Intent(context, UpdateService.class);
        context.startService(intent);
    

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                     int[] appWidgetIds) 
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        for (int i = 0; i < appWidgetIds.length; i++) 
            int appWidgetId = appWidgetIds[i];

            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
            Intent widgetClickIntent = new Intent(context, UpdateService.class);
            widgetClickIntent.setAction(UpdateService.ACTION_ON_CLICK);
            PendingIntent pendingIntentViewClick = PendingIntent.getService(context, 0, widgetClickIntent, 0);
            remoteViews.setOnClickPendingIntent(R.id.widget_imageview, pendingIntentViewClick);
            appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
        
    

服务:

public class UpdateService extends Service 
    static final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
    static final String ACTION_ON_CLICK = "android.MyWidget.ACTION_ON_CLICK";

    private final static IntentFilter intentFilter;

    static 
        intentFilter = new IntentFilter();
        intentFilter.addAction(ACTION_SMS_RECEIVED);
        intentFilter.addAction(ACTION_ON_CLICK);
    


    public final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() 
        @Override
        public void onReceive(Context context, Intent intent) 
            final String action = intent.getAction();

            if (action.equals(ACTION_SMS_RECEIVED)) 
                reactOnSms(context);
            
            if (action.equals(ACTION_ON_CLICK)) 
                onCLick(context);
            
        
    ;

    @Override
    public void onCreate() 
        super.onCreate();
        registerReceiver(broadcastReceiver, intentFilter);
    

    @Override
    public void onDestroy() 
        super.onDestroy();
        unregisterReceiver(broadcastReceiver);
    

    @Override
    public IBinder onBind(Intent intent) 
        return null;
    

    private void reactOnSms(Context context) 
        // doSomething
    

    public void onCLick(Context context) 
        // doSomething
    

清单:

    <receiver a:name="..."...>
        <intent-filter>
            <action a:name="android.provider.Telephony.SMS_RECEIVED"/>
            <action a:name="android.MyWidget.ACTION_ON_CLICK"/>
        </intent-filter>
        <meta-data a:name="android.appwidget.provider"
                   a:resource="@xml/my_widget_provider_info"/>
    </receiver>
    <service a:name=".UpdateService"
            a:label="UpdateService">

        <intent-filter>
            <action a:name="android.provider.Telephony.SMS_RECEIVED"/>
            <action a:name="android.MyWidget.ACTION_ON_CLICK"/>
        </intent-filter>
    </service>

我试过这个Clickable widgets in android

【问题讨论】:

【参考方案1】:

我找到了解决办法。

对于阅读此问题的人深表歉意。里面的代码太多了,我明白了。

问题在于 UpdateService 不是广播意图的真正处理程序。 BroadcastReceiver 的匿名实现完成了所有工作。

所以问题出在这段代码中(widgetProvider):

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                 int[] appWidgetIds) 
    super.onUpdate(context, appWidgetManager, appWidgetIds);
    for (int i = 0; i < appWidgetIds.length; i++) 
        int appWidgetId = appWidgetIds[i];

        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
        // wrong:
        // Intent widgetClickIntent = new Intent(context, UpdateService.class);
        // widgetClickIntent.setAction(UpdateService.ACTION_ON_CLICK);
        // PendingIntent pendingIntentViewClick = PendingIntent.getService(context, 0, widgetClickIntent, 0);
        // correct:
        Intent widgetClickIntent = new Intent(UpdateService.ACTION_ON_CLICK);
        PendingIntent pendingIntentViewClick = PendingIntent.getBroadcast(context, 0, widgetClickIntent, 0);
        ///////
        remoteViews.setOnClickPendingIntent(R.id.widget_imageview, pendingIntentViewClick);
        appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
    

【讨论】:

以上是关于Android:可点击的图像视图小部件的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像从 url 加载到小部件的 android 远程视图中

带有 ListView 的 Android 可点击小部件在 ListItems 上不可点击

android小部件内ListView中的多个可点击项目

如何在android小部件中单击图像按钮显示吐司

如何将垂直滚动 TextView 添加到 Android 小部件

是否可以在 Android 主屏幕小部件中向 im​​ageView 添加自定义可绘制对象?