无法在窗口小部件中更新Button的文本

时间:2013-08-03 16:40:11

标签: android widget homescreen remoteview appwidgetprovider

如何访问主屏幕Widget的项目,以便我可以更改它们,例如设置Button的文字?在我AppWidgetProvider的{​​{1}}方法中,我正在尝试设置onReceive()的文本,该文本位于我的主屏幕小部件中:

Button

我的小工具@Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(MainActivity.ACTION_CHANGE_BUTTONSTATE)) { String state = intent.getExtras().getString("state"); Log.d("HomescreenWidget", "received broadcast for button state"); RemoteViews views = new RemoteViews(context.getPackageName(), R.id.widgetButton); views.setTextViewText(R.id.widgetButton, state); ComponentName cn = new ComponentName(context, HomescreenWidget.class); AppWidgetManager.getInstance(context).updateAppWidget(cn, views); } super.onReceive(context, intent); }

layout.xml

我收到了<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/RelativeLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/widget_margin" > <Button android:id="@+id/playButton_Widget" style="?android:attr/buttonStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:minWidth="80dp" android:text="@string/playButton" /> </RelativeLayout> ,但我的Broadcast显示了以下文字:“问题加载小部件”。

修改 我在catlog上找到了以下消息:

Widget

W/AppWidgetHostView(135): updateAppWidget couldn't find any view, using error view W/AppWidgetHostView(135): android.widget.RemoteViews$ActionException: can't find view: 0x7f0a0004 是我0x7f0a0004的{​​{1}}。可能是什么原因,它无法找到?

3 个答案:

答案 0 :(得分:2)

要通过appwidget提供程序访问您的视图,您可以使用此远程视图

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
views.setTextViewText(R.id.widgetname, newName);

或通过服务:

public class UpdateWidgetService extends Service {

  @Override
  public IBinder onBind(Intent intent) {
    return null;
  }

  @Override
  public void onStart(Intent intent, int startId) {
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this
        .getApplicationContext());

    int[] allWidgetIds = intent
        .getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);

    for (int widgetId : allWidgetIds) {

      RemoteViews remoteViews = new RemoteViews(this
          .getApplicationContext().getPackageName(),
          R.layout.widget_layout);

      remoteViews.setTextViewText(R.id.update,
          "Random: " + String.valueOf(number));

      appWidgetManager.updateAppWidget(widgetId, remoteViews);
    }
    stopSelf();

    super.onStart(intent, startId);
  }

} 

并且不要忘记将服务添加到清单

<service android:name=".UpdateWidgetService"></service> 

然后在onUpdate(在你的App Widget Provider类中)

@Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager,
      int[] appWidgetIds) {

    ComponentName thisWidget = new ComponentName(context,
        MyWidgetProvider.class);
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);

    Intent intent = new Intent(context.getApplicationContext(),
        UpdateWidgetService.class);
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);

    context.startService(intent);
  }

我希望这有助于:)

答案 1 :(得分:0)

我刚刚找到了解决方案。我一直在为Button传递错误的ID。 widgetButton的布局中不存在Widget。这是我的主要Activity

按钮

答案 2 :(得分:0)

import android.widget.RemoteViews;

//抓取布局,然后设置名为R.id.Counter的按钮文本:

RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.my_layout);
remoteViews.setTextViewText(R.id.Counter, "Set button text here");