2012-06-13 14 views
10

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: enter image description hereWidget 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.

+0

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

+0

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

+0

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

Odpowiedz

-1

Re-klejący lub przesuwając widget sprawia, że ​​widoczne po pewnym czasie. Aby to naprawić, umieściłem domyślny obraz w moim widoku obrazu i zadziałało to dla mnie.

Powiązane problemy