2011-09-25 141 views
3

我想打一個很簡單的小工具:安卓:可點擊的ImageView小部件

它必須在有來電的短信只是一個圖像視圖

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

回答

5

我找到了解決辦法。

對不起,你閱讀這個問題的人。我理解,裏面的代碼太多了。

的問題是,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); 
    } 
}