【问题标题】:Change src image of ImageButton of Android widget programatically以编程方式更改 Android 小部件 ImageButton 的 src 图像
【发布时间】:2014-06-07 08:59:28
【问题描述】:

我正在开发一个带有主屏幕小部件的 Android 应用程序,它是一个 imageButton,我希望按钮的图像在按下后改变。我曾尝试在 xml 文件中使用选择器来更改按钮的图像,但它仅在按下时才会更改,但在释放时会返回。

我希望它在按下后更改图像,并且当 WidgetProvider 中的代码执行时,它会将图像更改回默认图像。

我尝试以编程方式进行(在 onRecieve() 方法中),我想这应该是 RemoteViews 的东西,但无论我尝试什么,它都不起作用。

有人可以帮我解决这个问题吗?我看到很多人在问这个问题,但大多数帖子要么很旧,要么解决方案对我不起作用。

谢谢你:)

【问题讨论】:

    标签: android image button widget


    【解决方案1】:

    一个简单但不优雅的方法是:

     boolean isButtonSelected = false;
    
        ..
     button.setOnClickListener(buttonListener);
    
        ..
    
     OnClickListener buttonListener = new OnClickListener() {
      @Override
      public void onClick(View arg0) {
    
          if(isButtonSelected ){
              isButtonSelected = false;
              button.setBackgroundResource(R.drawable.buttonOff);  // or setImageResource(..);
          } else{
              isButtonSelected = true;
              button.setBackgroundResource(R.drawable.buttonOn);
          }
       }
     };
    

    【讨论】:

    • 如果它在一个 Activity 中会起作用,你可以在其中找到 ViewById 一个按钮并更改它的属性,但是在 WidgetProvider 中没有这样的方法,这就是为什么我真的不知道该怎么做。 ://
    【解决方案2】:

    通常您会使用setImageResource 方法将图像设置在ImageButton 的表面上(ImageButtonImageView 继承它),但该方法不适用于RemoteViews

    设置图像的代码(例如,在 BroadcastReceiver 的 onReceive 方法中)如下所示:

    @Override
    public void onReceive(Context context, Intent intent) {
        int appWidgetId = intent.getIntExtra("appWidgetId", -1);    
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
        views.setImageViewResource(R.id.imageButton1, R.drawable.awesome_image);
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
    

    请注意,上面的代码假设您已使用键“appWidgetId”将要操作的小部件的 id 添加为广播意图的额外内容(包装在用户单击 ImageButton 时发送的 PendingIntent 中)。您很可能希望在 AppWidgetProvider 的 onUpdate 方法中执行此操作,如下所示:

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for (int i = 0; i < appWidgetIds.length; i++) {
            int appWidgetId = appWidgetIds[i];
            Intent intent = new Intent ("YourActionHere");
            intent.putExtra("appWidgetId", appWidgetId);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, intent, 0);
    
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
            views.setImageViewResource(R.id.imageButton1, R.drawable.initial_image);
    
            views.setOnClickPendingIntent(R.id.imageButton1, pendingIntent);
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2013-01-13
      • 2011-08-31
      相关资源
      最近更新 更多