2013-08-03 2 views
1

Как получить доступ к элементам домашнего экрана Widget, поэтому я могу внести в них изменения, например, установить текст Button? В моем AppWidgetProvider «ы 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 , но затем мой Widget показывает следующий текст: «Проблема с загрузкой виджета».

EDIT я нашел следующее сообщение в catlog:

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 мои Widget «ы Button. Что может быть причиной того, что его нельзя найти?

+0

К сожалению просто хочу подтвердить вы хотите изменить некоторые представления в приложениях с главного экрана виджета? –

+0

Я получил кнопку «Button», которая относится к «макету» рабочего стола «Widget». Когда эта кнопка нажата, я хочу изменить ее текстовую метку. Для этого мне нужна ссылка на него – wodzu

+0

текстовая метка в виджетах рабочего стола? –

ответ

0

Я только что нашел решение. Все время я пропускал неправильный идентификатор для кнопки. widgetButton не было на макете Widget. Это была кнопка от моего основного Activity

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 (в вашем классе поставщика виджетов приложений)

@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); 
    } 

Я надеюсь, что это может помочь :)

+0

Я пробовал это через remoteviews, как вы сказали (я редактировал вопрос , поэтому вы можете видеть, что я сделал). Ничего не произошло. – wodzu

0

импорт android.widget.RemoteViews;

// захватить макет, а затем установить текст кнопки под названием R.id.Counter:

RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.my_layout); 
remoteViews.setTextViewText(R.id.Counter, "Set button text here"); 
Смежные вопросы