#android #widget
#Android #виджет
Вопрос:
Я тестировал свое приложение на телефоне с Android n. С виджетом в этом телефоне проблем не было. Но когда я пробовал на других телефонах, при нажатии на ImageView происходят странные вещи: ImageView обновляется и преобразуется в виджет просмотра, а затем показывает сообщение об ошибке. И в logcat ничего нет.
общедоступный класс RadioWidget расширяет AppWidgetProvider {
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {
// Construct the RemoteViews object
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.radio_widget);
//Go to radio/track info fragment
Intent radiointent = new Intent(context, MainActivity.class);
radiointent.setAction("**********.play");
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, radiointent, 0);
views.setOnClickPendingIntent(R.id.wlastp, pendingIntent);
radiointent.setAction("*********.track.info.last");
pendingIntent = PendingIntent.getActivity(context , 0, radiointent, 0);
views.setOnClickPendingIntent(R.id.artwork, pendingIntent);
//Play/Stop radio
Intent controls = new Intent(context, NotificationControls.class);
controls.setAction("********.widget.play");
PendingIntent play = PendingIntent.getBroadcast(context.getApplicationContext(),1,controls,0);
views.setOnClickPendingIntent(R.id.wplay, play);
controls.setAction("********.widget.stop");
PendingIntent stop = PendingIntent.getBroadcast(context.getApplicationContext(),2,controls,0);
views.setOnClickPendingIntent(R.id.wstop, stop);
views.setTextViewText(R.id.trackname, "now playing"));
//Load image
Glide.with(context.getApplicationContext())
.load(/* artwork url*/)
.asBitmap()
.error(R.mipmap.album_placeholder)
.into(new AppWidgetTarget(context.getApplicationContext(),views,R.id.artwork,appWidgetId));
else views.setImageViewResource(R.id.artwork, R.mipmap.album_placeholder);
int button_state = R.drawable.ic_play_arrow_black_24dp;
if(/* checking if radio is playing */) button_state = R.drawable.ic_pause_black_24dp;
views.setImageViewResource(R.id.wplay, button_state);
// Instruct the widget manager to update the widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// There may be multiple widgets active, so update all of them
for (int appWidgetId : appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}
}
xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/BG"
android:padding="@dimen/widget_margin">
<ImageView
android:layout_width="80dp"
android:layout_height="match_parent"
android:src="@mipmap/album_placeholder"
android:contentDescription="@string/cd_artwork"
android:id="@ id/artwork"
android:layout_alignParentLeft="true"
android:scaleType="centerCrop"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/media_play_now"
android:id="@ id/trackname"
android:layout_alignParentTop="true"
android:layout_toRightOf="@ id/artwork"
android:layout_toEndOf="@ id/artwork"
android:textSize="16sp"
android:minLines="2"
android:layout_marginTop="4dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@ id/trackname"
android:layout_alignLeft="@ id/trackname"
android:layout_alignStart="@ id/trackname"
>
<ImageView
android:id="@ id/wplay"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:src="@drawable/ic_play_arrow_black_24dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
/>
<ImageView
android:id="@ id/wstop"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:src="@drawable/ic_stop_black_24dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
/>
<ImageView
android:id="@ id/wlastp"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:src="@drawable/ic_last_played_black_24dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
/>
</LinearLayout>
</RelativeLayout>
манифест
<receiver android:name=".RadioWidget">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/radio_widget_info" />
</receiver>
и вот мой метод обновляет виджет из Сервиса
public void updateRadioWidget(Context context) {
AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);
ComponentName widgetComponent = new ComponentName(context, RadioWidget.class);
int[] widgetIds = widgetManager.getAppWidgetIds(widgetComponent);
Intent update = new Intent();
update.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIds);
update.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
context.sendBroadcast(update);
}
Я попробовал другой пост, но безуспешно. Он работает в Android N, но не в других.
Комментарии:
1. Что это за сообщение об ошибке? Как это выглядит?
2. Он показывает несколько виджетов часов, и это происходит imgur.com/a/e3K8g
Ответ №1:
Я отредактировал свой метод обновления, похоже, он работает прямо сейчас
public void updateRadioWidget() {
int[] ids = AppWidgetManager.getInstance(context.getApplicationContext()).getAppWidgetIds(new ComponentName(context.getApplicationContext(), RadioWidget.class));
RadioWidget radioWidget = new RadioWidget();
radioWidget.onUpdate(context.getApplicationContext(), AppWidgetManager.getInstance(context.getApplicationContext()),ids);
}