安卓:可点击ImageView的部件 [英] Android: Clickable imageview widget

查看:104
本文介绍了安卓:可点击ImageView的部件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想打一个很简单的小工具:

I want to make a very simple widget:

这必须由只从一个图像视图

It must consist from just one image view

1)收到的短信应该改变形象

1) on incoming sms it should change the image

2)单击它也应该改变形象

2) on click it also should change the image

我试了一下使用的ImageButton进行,但失败:有与短信改变图像接收到的事件的问题:新的图像有错误的比例

I tried to make it using ImageButton but failed: there were problems with changing the image on sms received event: new image had wrong scale.

反正现在我想打一个ImageView的没有别的了。

Anyway now I want to make an ImageView without anything else.

问题是,我不能处理onClick事件:

The problem is that I can't handle onClick event:

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

I've got a running service which should handle all events: sms received and click:

部件供应商:

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>

我试过这个可点击的小部件的Andr​​oid

推荐答案

我找到了解决办法。

对不起,你们谁读的问题。太多code里面,我明白了。

Sorry for those of you who read the question. Too much code inside, I understand.

的问题是,UpdateService不是广播意图的实际处理程序。匿名实现广播接收器中所做的所有工作。

The problem was that UpdateService was not the real handler of the broadcast intent. Anonymous implementation of BroadcastReceiver made all the work.

所以,问题是在这个code(widgetProvider):

So the problem was in this code (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);
    }
}

这篇关于安卓:可点击ImageView的部件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆