У меня есть виджет с действием настройки. Когда пользователь хочет разместить виджет на главном экране, открывается действие настройки, пользователь выбирает содержимое, цвет фона и цвет текста виджета, и все готово. Когда я переустанавливаю приложение, виджет становится невидимым. Он все еще там, но без текста и цвета. См. изображение:
Я выложу все свои файлы, а в конце расскажу в чем может быть проблема. Чего я не знаю, так это решения.
widgetconfigure.xml
Это схема действий по настройке. Я не собираюсь публиковать этот xml. Он имеет текстовые представления в макетах.
widget_layout.xml
Часть манифеста, в которой я регистрирую свои действия по настройке и appwidgetprovider:
xml/widget_info.xml
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
Поэтому я почти уверен, что проблема здесь в методе onUpdate, так как я не устанавливаю макет виджета. Я оставил строку с //, чтобы показать, что если я ее добавлю, я получу виджет без фона, но с текстом «Что-то».
Как я должен установить цвет фона, цвет текста виджета и текст TextView для виджета в этом методе? Я их не знаю, их устанавливает пользователь при добавлении виджета. Или что мне делать?
РЕДАКТИРОВАТЬ
Я нашел этоткод и изменил свой следующим образом:
Я добавил
saveTitlePref(this, AppWidgetManager.INVALID_APPWIDGET_ID, widgettext);
в метод onClick в WidgetConfig.java, поэтому, когда пользователь нажимает OK в конфигурации, виджеттекст будет сохранен с appwidgetid (не знаю, что 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
где я добавил
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;
}
}
Это все еще не работает, но становится ближе. Я помещаю два виджета с разными текстами на главный экран, затем переустанавливаю приложение. Теперь у обоих виджетов есть тексты (разумеется, так как я его задал), но у них такой же текст, тот, который я выбрал для 2-го виджета.
Пожалуйста, помогите мне.