Intereting Posts
Где я могу создать и использовать ScheduledThreadPoolExecutor, TimerTask или Handler? Как я должен делать это с уведомлением до начала деятельности без новых намерений Управление переключателем не работает на Dialog в Android версии 5.0 Начало работы с Android-разработкой с помощью Honeycomb Невозможно создать проект, зависящий от библиотеки, после обновления до 14 ADT Android Datepicker Fragment – Как сделать что-то, когда пользователь устанавливает дату? Как получить круговой, обрезанный по центру образ, без создания нового растрового изображения? Как изменить цвет большого пальца в панели поиска? Интеграция jpct-ae с процессором Vuforia от Qualcomm в Android Как создать пользовательскую панель прогресса в Android? Создайте андроид apk, используя сценарий оболочки из php? Вызов метода активности из фрагмента Как установить программный эффект Ripple на LinearLayout? Gradlew build frozing at mergeDebugResources Android TabLayout Android Design

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

У меня есть виджет с активностью 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

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