Mam widżet z działaniem konfiguracyjnym. Kiedy użytkownik chce umieścić widżet na ekranie głównym, otwiera się działanie konfiguracyjne, użytkownik wybiera zawartość, kolor tła i kolor tekstu widgetu, a tam jest. Po ponownym zainstalowaniu aplikacji widżet staje się niewidoczny. Wciąż tam jest, ale bez tekstu i koloru. Zobacz img: Widget staje się niewidoczny po ponownym zainstalowaniu
Mam zamiar zamieścić wszystkie moje pliki, a na końcu powiem ci, co może być problem. To, czego nie wiem, jest rozwiązaniem.
widgetconfigure.xml
Jest to układ z tym aktywność konfiguracji. Nie będę publikować tego xml. Ma textviews w układach.
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>
Część manifeście gdzie mogę zarejestrować działalność konfiguracji i 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
Jest to aktywność konfiguracja. Użytkownik wybiera tło i kolor tekstu widgetu oraz tekst z listy do wyświetlenia w widgecie. Mam zamiar dodawać tylko odpowiednią część:
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);
}
}
więc jestem całkiem pewien problem jak ja nie ustawiania układu jest tutaj w sposób onUpdate, widżetu. Zostawiłem linię z //, aby pokazać, czy dodam ją, otrzymam widżet bez tła, ale z tekstem "Coś".
W jaki sposób mam ustawić kolor tła, kolor tekstu widgetu i tekst TextView na widżecie w tej metodzie? Nie znam ich, użytkownik ustawia je podczas dodawania widżetu. Albo co mam zrobić?
EDIT
I znaleziono kodu this kopalni i zmodyfikowany w następujący sposób:
I dodaje saveTitlePref(this, AppWidgetManager.INVALID_APPWIDGET_ID, widgettext);
metody onClick w WidgetConfig.java, więc, gdy użytkownik naciśnie przycisk OK w tym aktywność konfiguracji , tekst widżetu zostanie zapisany z appwidgetid (Idk co appwidgetid, ponieważ kod używa AppWidgetManager.INVALID_APPWIDGET_ID).
Aby to działało mi potrzebne to:
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();
}
W klasie MyWidgetProvider I zmodyfikowane dla pętli tak:
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);
}
gdzie dodałem
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;
}
}
nadal nie działa, ale się zbliża. Umieszczam dwa widżety z różnymi tekstami na ekranie głównym, a następnie ponownie instaluję aplikację. Teraz oba widgety mają teksty (oczywiście, odkąd je ustawiłem), ale mają ten sam tekst, który wybrałem dla drugiego widżetu.
Proszę, pomóż mi.
Nikt? Nie wiedziałem, że to trudne pytanie. Widziałem aplikacje z wieloma różnymi widżetami ustawionymi przez użytkowników, więc co mam zrobić? – erdomester
Oferuję nagrodę w wysokości 100 kredytów każdemu, kto powie mi, jak obsługiwać widżety z ustawieniami ustawionymi przez użytkownika w czynności konfiguracyjnej. – erdomester
Nie mam pojęcia o tym, ale tak jak myśl, czy wypróbowałeś to na Androidzie? Miałem takie problemy z wcześniejszym wyczuciem. To może być specyficzny błąd, który tylko wprowadził Cię w złym kierunku. – kishu27