У меня есть виджет с активностью configure. Когда пользователь хочет разместить виджет на главном экране, открывается действие 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;
}
}
Это все еще не работает, но все ближе. Я помещаю два виджета с разными текстами на главный экран, а затем переустанавливаю приложение. Теперь у обоих виджета есть тексты (конечно, так как я его установил), но у них есть тот же текст, который я выбрал для второго виджета.
Пожалуйста, помогите мне.