Виджет становится невидимым после переустановки

У меня есть виджет с активностью configure. Когда пользователь хочет разместить виджет на главном экране, открывается действие конфигурации, пользователь выбирает контент, цвет фона и цвет текста виджета, и он есть. Когда я переустанавливаю приложение, виджет становится невидимым. Он все еще существует, но без текста и цвета. См. Img: Введите описание изображения здесь

Я собираюсь опубликовать все мои файлы, и в конце я расскажу вам, что может быть проблемой. То, что я не знаю, – это решение.

widgetconfigure.xml

Это макет конфигурации. Я не собираюсь публиковать этот xml. Он имеет текстовые изображения в макетах.

widget_layout.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="72dip" android:layout_height="72dip" android:layout_gravity="center" android:id="@+id/widgetlayout"> <ImageView android:id="@+id/ImageView01" android:layout_width="72dip" android:layout_height="72dip" android:scaleType="fitXY"> </ImageView> <TextView android:id="@+id/tvConfigInput" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:gravity="left" android:textColor="#FFFFFF" android:layout_marginLeft="3dip" android:layout_marginRight="3dip" android:textSize="12dip" /> </RelativeLayout> 

Часть манифеста, где я регистрирую свою конфигурационную активность и приложение appwidgetprovider:

  <activity android:name=".WidgetConfig" android:label="@string/app_name" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> </intent-filter> </activity> <receiver android:name=".MyWidgetProvider" android:label="@string/app_name"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_info"></meta-data> </receiver> 

XML / widget_info.xml

 <?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/widget_layout" android:minHeight="72dp" android:minWidth="72dp" android:configure="com.b2creative.notepad.WidgetConfig"> </appwidget-provider> 

WidgetConfig.java

Это настройка конфигурации. Пользователь выбирает фоновый и текстовый цвет виджета и текст из списка, который должен отображаться в виджетах. Я собираюсь опубликовать только соответствующую часть:

  AppWidgetManager awm; int awID; Intent i = getIntent(); Bundle extras = i.getExtras(); if (extras != null) { awID = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); } else { finish(); } awm = AppWidgetManager.getInstance(c); //the code from here is in a button onclicklistener that sets the widget. RemoteViews views = new RemoteViews(c.getPackageName(), R.layout.widget_layout); views.setTextViewText(R.id.tvConfigInput, widgettext); views.setTextColor(R.id.tvConfigInput, loadedtextcolor); views.setFloat(R.id.tvConfigInput, "setTextSize", int_widgetfontsize); Paint p = new Paint(); p.setAntiAlias(true); p.setStyle(Style.FILL); p.setColor(loadedbgcolor); Bitmap bitmap = Bitmap.createBitmap(GetDipsFromPixel(72), GetDipsFromPixel(72), Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); RectF rect = new RectF(0, 0, GetDipsFromPixel(72), GetDipsFromPixel(72)); canvas.drawRoundRect(rect, 10, 10, p); views.setImageViewBitmap(R.id.ImageView01, bitmap); Intent in = new Intent(c, Notepad.class); PendingIntent pi = PendingIntent.getActivity(c, 0, in, 0); Intent result = new Intent(); result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, awID); setResult(RESULT_OK, result); awm.updateAppWidget(awID, views); finish(); 

MyWidgetProvider.java

 public class MyWidgetProvider extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); final int N = appWidgetIds.length; for (int i=0; i<N; i++) { int awID = appWidgetIds[i]; RemoteViews v = new RemoteViews(context.getPackageName(), R.layout.widget_layout); //v.setTextViewText(R.id.tvConfigInput, "Something"); appWidgetManager.updateAppWidget(awID, v); } } @Override public void onDeleted(Context context, int[] appWidgetIds) { super.onDeleted(context, appWidgetIds); } } 

Поэтому я уверен, что проблема здесь в методе onUpdate, так как я не устанавливаю макет виджета. Я оставил строку с //, чтобы показать, добавляю ли я ее, я получаю виджет без фона, но с текстом «Что-то».

Как я должен установить цвет фона, цвет текста виджета и текст TextView в виджет в этом методе? Я не знаю их, пользователь устанавливает их при добавлении виджета. Или что я должен делать?

РЕДАКТИРОВАТЬ

Я нашел этот код и модифицировал мой так:

Я добавил saveTitlePref(this, AppWidgetManager.INVALID_APPWIDGET_ID, widgettext); К методу onClick в WidgetConfig.java, поэтому, когда пользователь нажимает OK в настройке acitivty, виджет-текст будет сохранен с помощью appwidgetid (Idk, какой appwidgetid, поскольку код использует AppWidgetManager.INVALID_APPWIDGET_ID).

Для этого мне это нужно:

  static void saveTitlePref(Context context, int appWidgetId, String text) { SharedPreferences.Editor prefs = context.getSharedPreferences(PREFS_NAME, 0).edit(); prefs.putString(PREF_PREFIX_KEY + appWidgetId, text); prefs.commit(); } 

В классе MyWidgetProvider я изменил цикл for следующим образом:

 final int N = appWidgetIds.length; for (int i=0; i<N; i++) { int awID = appWidgetIds[i]; RemoteViews v = new RemoteViews(context.getPackageName(), R.layout.widget_layout); //v.setTextViewText(R.id.tvConfigInput, "Something"); v.setTextViewText(R.id.tvConfigInput, loadTitlePref(context, AppWidgetManager.INVALID_APPWIDGET_ID)); appWidgetManager.updateAppWidget(awID, v); } 

Где я добавил

  static String loadTitlePref(Context context, int appWidgetId) { SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0); String prefix = prefs.getString(PREF_PREFIX_KEY + appWidgetId, null); String nothing = "empty"; if (prefix != null) { return prefix; } else { return nothing; } } 

Он все еще не работает, но все ближе. Я размещаю на главном экране два виджета с разными текстами, затем переустанавливаю приложение. Теперь у обоих виджета есть тексты (конечно, с тех пор, как я их установил), но у них есть тот же текст, который я выбрал для второго виджета.

Пожалуйста, помогите мне.

Solutions Collecting From Web of "Виджет становится невидимым после переустановки"

Если изображение сохранено на SD-карте, у этого сообщения может быть ответ: http://www.technipages.com/android-icons-disappear-from-home-screen.html

Хорошим подходом может быть отображение / сохранение каждого идентификатора в sharedPrefs. Подробнее здесь: Обработка нескольких экземпляров appwidget и здесь: http://www.androidbook.com/akc/display?url=DisplayNoteIMPURL&reportId=3307&downerUserId=satya

Повторная калибровка или перемещение виджета делает его видимым через некоторое время. Чтобы исправить это, я поместил изображение по умолчанию в мое изображение, и это сработало для меня.