2011-10-14 7 views
5

Escribí un AppWidget para mi aplicación que puede elegir el nombre del lugar que le gusta y le muestra una foto de ese lugar.El widget no se actualiza después de los cambios de configuración

Tiene una actividad de configuración (utilicé la misma actividad de configuración de la aplicación) cuando se agrega por primera vez, el widget y su configuración funcionan bien: elijo un lugar que me gusta y veo la imagen;

El problema es Cada vez que reinicie el dispositivo (o se sale del modo de suspensión) luego cuando hago clic en él (el widget) Voy a la actividad de configuración - cambio en la foto deseada y no pasa nada cuando elimino errores puedo ver que:

appWidgetManager.updateAppWidget(mAppWidgetId, views); 
mAppWidgetId = 

tiene un id y views no es null. entonces, ¿qué está pasando el hack? mi idea es que al reiniciar el dispositivo, el widgetID cambia, y que no lo manejo como debería. Por cierto, si intentar lo mismo en el emulador no tengo problemas todo funciona bien

aquí está mi código:

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 Clase

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; 
     } 
    } 
} 

prefences clase

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(); 
      } 
     } 
    } 
} 

Respuesta

Cuestiones relacionadas