我开始疯狂地试图弄清楚这一点。看起来应该很容易,我开始怀疑是否可能。
我想做的是创建一个主屏幕小部件,仅包含一个 ImageButton。
当按下它时,想法是更改一些设置(例如 Wi-Fi 切换),然后更改按钮图像。
我在 main.xml 中声明了 ImageButton
<ImageButton android:id="@+id/buttonOne"
android:src="@drawable/button_normal_ringer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
我的 AppWidgetProvider 类,名为 ButtonWidget
*** 请注意,RemoteViews 类是本地存储的变量。这使我能够访问 RViews 布局元素......或者我是这么认为的。
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
remoteViews = new RemoteViews(context.getPackageName(),
R.layout.main);
Intent active = new Intent(context, ButtonWidget.class);
active.setAction(VIBRATE_UPDATE);
active.putExtra("msg","TESTING");
PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context,
0, active, 0);
remoteViews.setOnClickPendingIntent(R.id.buttonOne,
actionPendingIntent);
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
}
@Override
public void onReceive(Context context, Intent intent) {
// v1.5 fix that doesn't call onDelete Action
final String action = intent.getAction();
Log.d("onReceive",action);
if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
final int appWidgetId = intent.getExtras().getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
this.onDeleted(context, new int[] { appWidgetId });
}
} else {
// check, if our Action was called
if (intent.getAction().equals(VIBRATE_UPDATE)) {
String msg = "null";
try {
msg = intent.getStringExtra("msg");
} catch (NullPointerException e) {
Log.e("Error", "msg = null");
}
Log.d("onReceive",msg);
if(remoteViews != null){
Log.d("onReceive",""+remoteViews.getLayoutId());
remoteViews.setImageViewResource(R.id.buttonOne, R.drawable.button_pressed_ringer);
Log.d("onReceive", "tried to switch");
}
else{
Log.d("F!", "--naughty language used here!!!--");
}
}
super.onReceive(context, intent);
}
}
所以,我一直在测试这个,并且 onReceive 方法效果很好,我能够发送通知和各种东西(从代码中删除以便于阅读)
我不能做的一件事是更改视图元素的任何属性。
为了尝试解决这个问题,我将 RemoteViews 设置为本地静态私有变量。使用日志,我可以看到,当屏幕上显示应用程序的多个实例时,它们都引用 RemoteViews 的一个实例。非常适合我想做的事情
麻烦在于尝试更改 ImageButton 的图像。
我可以使用此方法在 onUpdate 方法中执行此操作。
remoteViews.setImageViewResource(R.id.buttonOne, R.drawable.button_pressed_ringer);
一旦创建了小部件,这对我没有任何好处。
由于某种原因,即使它位于同一个类中,位于 onReceive 方法内部也会使该行不起作用。
事实上,该行曾经抛出一个空指针,直到我将变量更改为静态。现在它通过了空测试,引用了与开始时相同的layoutId,读取了该行,但它什么也不做。
就像代码根本不存在一样,只是一直在运行。
SO......
创建小部件后,有什么方法可以在小部件内修改布局元素!?
我想根据环境来执行此操作,而不是通过配置活动启动。
我一直在研究各种问题,这似乎是一个真正尚未解决的问题,例如链接文本 https://stackoverflow.com/questions/2181588/whats-the-proper-way-to-implement-an-android-widget-with-dynamically-drawn-conte and 链接文本 https://stackoverflow.com/questions/1977017/changing-a-widgets-icon-from-onupdate
哦,对于任何发现此内容并想要一个良好的小部件入门教程的人来说,这很容易遵循(虽然有点旧,但它让您对小部件感到满意).pdf链接文本 http://www.helloandroid.com/files/xmaswidget/android_howto-hellowidget.pdf
希望有人可以在这里提供帮助。我有点感觉这是非法的,并且有不同的方法可以解决这个问题。我很想知道另一种方法!!!!
Thanks