Search code examples
androidandroid-widgetremoteview

How to change the image in app widget programmatically in android


I design an android app widget in which two ImageView i want change the image both of the the ImageView when click on the image as well as call a method. Now i use RemoteView like this

RemoteViews views1 = new RemoteViews(context.getPackageName(),
                R.layout.activity_main);
        views1.setOnClickPendingIntent(R.id.smsImageView, pendIntent1);
        appWidgetManager.updateAppWidget(appWidgetIds, views1);

but i have no idea how i change the image in imageView Thanks.


Solution

  • Widget_Layout :

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:orientation="horizontal" >
    
        <ImageView
            android:id="@+id/imageview1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/imageview1_image1"/>
    
        <ImageView
            android:id="@+id/imageview2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="2dp"
            android:src="@drawable/imageview2_image1" />
    
    </LinearLayout>
    

    In your AppWidgetProvider :

    public class SwitchWidget extends AppWidgetProvider {
    public static String SWITCH_WIDGET_UPDATE = "MainActivity.Switch";
    public static String IMAGEVIEW1 = "imageview1";
    public static String IMAGEVIEW2 = "imageview2";
    
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        // TODO Auto-generated method stub
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        updateSwitch1(context, appWidgetManager, appWidgetIds[0]);
    }
    
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        super.onReceive(context, intent);
        Log.d("SWitch Widget", "On Receive");
    
    
    
    
        RemoteViews remoteViews;
    
        AppWidgetManager appWidgetManager = AppWidgetManager
                .getInstance(context);
    
        if (SWITCH_WIDGET_UPDATE.equals(intent.getAction())) {
            Log.d("SWitch Widget", "Widget Choose");
            ComponentName thisAppWidget = new ComponentName(
                    context.getPackageName(), getClass().getName());
    
            int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);
            for (int appWidgetID : ids) {
    
                    updateSwitch1(context, appWidgetManager, appWidgetID);
                } 
    
            }
    
        }
        if (intent.getAction().equals(IMAGEVIEW1)) {
    
    
    
    
                remoteViews = new RemoteViews(context.getPackageName(),
                        R.layout.widget1);
                if(flag){
                flag = flase           
                    remoteViews.setImageViewResource(R.id.imageview1,
                            R.drawable.imageview1_image2);
                     startService(new Intent(this, YOUR_SERVICE_CLASS_NAME.class)); 
                } else {
                flag = true;
                    remoteViews.setImageViewResource(R.id.imageview1,
                            R.drawable.imageview1_image1);
                    startService(new Intent(this, YOUR_SERVICE_CLASS_NAME.class));
                }
                appWidgetManager.updateAppWidget(new ComponentName(context,
                        SwitchWidget.class), remoteViews);
    
    
            }
            else if (intent.getAction().equals(IMAGEVIEW2)) {
    
                remoteViews = new RemoteViews(context.getPackageName(),
                        R.layout.widget1);
                if(flag){
             flag = flase          
                    remoteViews.setImageViewResource(R.id.imageview2,
                            R.drawable.imageview2_image2);
                } else {
            flag = true;
                    remoteViews.setImageViewResource(R.id.imageview2,
                            R.drawable.imageview2_image1);
                }
                appWidgetManager.updateAppWidget(new ComponentName(context,
                        SwitchWidget.class), remoteViews);
    
          }
    
    
    
    private void updateSwitch1(Context context,
            AppWidgetManager appWidgetManager, int appWidgetId) {
        // TODO Auto-generated method stub
        Log.d("SWitch Widget", "Switch1");
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
                R.layout.widget1);
    
    
    
        Intent imageview1Intent= new Intent(context, SwitchWidget.class);
        wifiIntent.putExtra("ID", appWidgetId);
        wifiIntent.setAction(IMAGEVIEW1);
        PendingIntent imageview1PendingIntent = PendingIntent.getBroadcast(context,
                0, imageview1Intent,0);
        remoteViews.setOnClickPendingIntent(R.id.imageview1, imageview1PendingIntent);
    
        Intent imageview2Intent= new Intent(context, SwitchWidget.class);
        wifiIntent.putExtra("ID", appWidgetId);
        wifiIntent.setAction(IMAGEVIEW2);
        PendingIntent imageview2PendingIntent = PendingIntent.getBroadcast(context,
                0, imageview2Intent,0);
        remoteViews.setOnClickPendingIntent(R.id.imageview2, imageview2PendingIntent);
    
        appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
        }
    
      }
    

    And also in your widget receiver add this two actions :

     <action android:name="imageview1" />
      <action android:name="imageview2" />