2011-10-14 17 views
5

Ho scritto un AppWidget per la mia app che è possibile scegliere il nome del luogo che ti piace e ti mostra una foto da quel luogo.non si aggiorna dopo le modifiche di configurazione

Ha un'attività di configurazione (ho utilizzato la stessa attività di configurazione dell'app stessa) quando aggiunto per la prima volta, il widget e il suo handeling di configurazione funzionano bene: scelgo un posto che mi piace e vedo la foto;

problema è ogni volta che si riavvia il dispositivo (o esce dalla modalità sleep) poi quando clicco su di esso (il widget) vado in attività di configurazione - modifica al pic e nulla desiderato accade quando il debug vedo che:

appWidgetManager.updateAppWidget(mAppWidgetId, views); 
mAppWidgetId = 

ha un id, e views non è null. quindi cosa sta succedendo? la mia idea è che al riavvio del dispositivo il widgetId cambia, e che non lo gestisco come dovrei. BTW se provare lo stesso sull'emulatore non ho problemi tutto funziona bene

qui è il mio codice:

Manifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.test.dryrun" android:versionCode="3" 
    android:versionName="1.1" android:installLocation="auto"> 
    <uses-sdk android:minSdkVersion="8" /> 

    <application android:icon="@drawable/ic_launcher_test" 
     android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 
     android:debuggable="true"><!-- different< android:theme="@style/Theme.NoBackground" --> 

     <!-- Main Activity --> 
     <activity android:name=".MyActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <!-- Preferences --> 

     <activity android:name=".Preferences.EditPreferences"> 
      <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/> 
     </activity> 

     <!-- Widgets --> 

     <!-- Widget--> 
     <receiver android:name=".Widget.testWidget" android:label="@string/app_widget_"> 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
       <!--action 
        android:name="com.test.dryrun.Widget.testWidget.PREFENCES_WIDGET_CONFIGURE" /--> 
      </intent-filter> 
      <meta-data android:name="android.appwidget.provider" 
       android:resource="@xml/test_widget__provider" /> 
     </receiver> 
     <service android:name=".Widget.testWidget$WidgetService" /> 

     <uses-permission android:name="android.permission.BIND_REMOTEVIEWS"></uses-permission> 
    </application> 
</manifest> 

appwidget_provider xml

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
android:minWidth="146dip" 
android:minHeight="146dip" 
android:updatePeriodMillis="0" 
android:initialLayout="@layout/test_widget" 
/> 

Widget Classe

public class testWidget extends AppWidgetProvider { 
    public static String PREFENCES_WIDGET_CONFIGURE = "ActionConfigureWidget"; 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     Intent svcIntent = new Intent(context, WidgetService.class); 
     widgets = appWidgetIds; 
     context.startService(svcIntent); 
    } 


    @Override 
    public void onReceive(Context context, Intent intent) 
    { 

     // v1.5 fix that doesn't call onDelete Action 
     final String action = intent.getAction(); 
     if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) 
     { 
      final int appWidgetId = intent.getExtras().getInt(
        AppWidgetManager.EXTRA_APPWIDGET_ID, 
        AppWidgetManager.INVALID_APPWIDGET_ID); 
      if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) 
      { 
       this.onDeleted(context, new int[] { appWidgetId }); 
      } 
     } 
     else 
     { 
      super.onReceive(context, intent);   
     } 
    } 

    //public void updateWidget() 
    /** 
    * @param context 
    * @param remoteViews 
    */ 
    public static void updateWidget(Context context, RemoteViews remoteViews) 
    { 
     String Prefix = context.getString(R.string._prefix); 

     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 
     String ToShow = prefs.getString(context.getString(
        R.string.Widget_string), 
        context.getString(R.string.default_string)); 

     String pkgName = context.getPackageName(); 
     int resID = context.getResources().getIdentifier(Prefix + ToShow, "drawable", pkgName); 

     WidgetController widgetController = WidgetController.getInstance(); 
     widgetController.setRemoteViewImageViewSource(remoteViews, R.id.WidgetImage, resID); 
    } 

    public static class WidgetService extends Service 
    { 
     @Override 
     public void onStart(Intent intent, int startId) 
     { 
      super.onStart(intent, startId); 
      // Update the widget 
      RemoteViews remoteView = buildRemoteView(this); 

      // Push update to homescreen 
      WidgetController.getInstance().pushUpdate(
        remoteView, 
        getApplicationContext(), 
        testWidget.class); 

      // No more updates so stop the service and free resources 
      stopSelf(); 
     } 

     public RemoteViews buildRemoteView(Context context) 
     { 
      RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.test_widget); 

      Intent configIntent = new Intent(context, EditPreferences.class); 
      configIntent.setAction(testWidget.PREFENCES_WIDGET_CONFIGURE); 


      configIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgets[0]); 

      //configIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      PendingIntent runtestPendingIntent = PendingIntent.getActivity(context, 0, configIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
      remoteViews.setOnClickPendingIntent(R.id.WidgetImage, runtestPendingIntent); 

      WidgetController controller = WidgetController.getInstance(); 

      controller.updateWidget(context, remoteViews); 

      return remoteViews; 
     } 

     @Override 
     public void onConfigurationChanged(Configuration newConfig) 
     { 
      int oldOrientation = this.getResources().getConfiguration().orientation; 

      if(newConfig.orientation != oldOrientation) 
      { 
       // Update the widget 
       RemoteViews remoteView = buildRemoteView(this); 

       // Push update to homescreen 
       WidgetController.getInstance().pushUpdate(
         remoteView, 
         getApplicationContext(), 
         testWidget.class); 
      } 
     } 

     @Override 
     public IBinder onBind(Intent arg0) 
     { 
      // TODO Auto-generated method stub 
      return null; 
     } 
    } 
} 

Preferenze di Google classe

public class EditPreferences extends PreferenceActivity implements OnSharedPreferenceChangeListener 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 
     Intent intent = getIntent(); 
     m_extras = intent.getExtras(); 
    } 
    private Bundle m_extras; 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) 
    { 
     if(key.equals(getString(R.string.rlvntString))) 
     { 
      Context ctx = getApplicationContext(); 
      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(ctx); 
      setResult(RESULT_CANCELED); 
      if (m_extras != null) 
      { 
       Intent resultValue = new Intent(); 

       String stringID = AppWidgetManager.EXTRA_APPWIDGET_ID; 
       mAppWidgetId = m_extras.getInt(
          stringID, 
          AppWidgetManager.INVALID_APPWIDGET_ID); 
       RemoteViews views = new RemoteViews(ctx.getPackageName(),R.layout.test_widget); 

       WidgetController.getInstance().updateWidget(ctx, views); 

       appWidgetManager.updateAppWidget(mAppWidgetId, views); 
       resultValue.putExtra(stringID, mAppWidgetId); 
       setResult(RESULT_OK, resultValue); 
       finish(); 
      } 
     } 
    } 
} 

risposta

Problemi correlati