我正在开发一个带有主屏幕小部件的Android应用程序,它是一个imageButton,我希望按下按钮的图像在按下后更改。我已经在xml文件中尝试了选择器,以更改按钮的图像,但只有在按下它时才更改它,但是当它被释放时它会返回。
我希望它在按下后更改图像,当执行WidgetProvider中的代码时,它会将图像更改回默认值。
我尝试以编程方式(在onRecieve()方法中),我想它应该是RemoteViews的东西,但无论我尝试什么,它都不起作用。
有人可以帮我解决这个问题吗?我看到很多人都在问这个问题,但大多数帖子要么很旧,要么解决方案对我不起作用。
谢谢:)
答案 0 :(得分:5)
通常情况下,您使用ImageButton方法在setImageResource表面上设置图像(ImageButton从ImageView继承),但该方法不是&{ #39; t适用于RemoteViews。
RemoteViews提供相应的setImageViewResource方法,可以满足您的需求(以及setImageViewBitmap和setImageViewUri,具体取决于您希望如何提供图片数据)。
设置图像的代码(例如,在您的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);
}
请注意,上面的代码假设您已添加要作为广播意图的额外操作的窗口小部件的ID(包含在用户单击ImageButton时发送的PendingIntent中),使用键&# 34; appWidgetId&#34 ;.您很可能希望在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);
}
}
答案 1 :(得分:-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);
}
}
};