2011-10-14 24 views
5

自分の好きな場所の名前を選ぶことができるAppWidgetを書いたので、その場所から写真が表示されます。設定変更後にウィジェットが更新されない

最初に追加したときに、 の設定アクティビティ(私はアプリの設定アクティビティと同じものを使用しました)があります。ウィジェットとそのコンフィグレーションハンドリングはうまくいきます。私は好きな場所を選び、写真を見ます。その後、

私はデバイスを再起動(またはそれがスリープモードの外に出る)するたびに問題がある 私はそれをクリック(ウィジェット)私は、構成アクティビティーに入る - 私はデバッグするときに必要なPICへの変更と何も 起こります私はそれを見ることができます:

appWidgetManager.updateAppWidget(mAppWidgetId, views); 
mAppWidgetId = 

idを持っており、viewsnullではありません。 ハックはどうなっていますか? 私の考えでは、デバイスの再起動時にwidgetIdが変更され、私はそれを私のように扱わないということです。 はところで、私は何の問題のすべてがここに罰金

に動作しない持っているエミュレータ上で同じことをしようとすると、私のコードです:

た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" 
/> 

ウィジェットクラス

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クラス

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

答えて

関連する問題