2010-12-04 10 views
0

Je rencontre un léger problème d'utilisation des préférences partagées dans mon widget. Je continue d'obtenir ce message de débogage sur ma préférence partagée, mais les ennemis d'id ne viennent pas comme une erreur.aucun fichier ou répertoire n'existe sur la préférence partagée

unable to unlink'/data/data/com.MyApps.WeatherViewer/shared_prefs/USER_PREFERENCE_WEATHER.xml.bak': No such file or directory (errno=2) 

ce qui pourrait être le problème parce que les valeurs stockées dans mes préférences partagées retournent null quand j'essaye d'y accéder. ?

2.) est-il possible de récupérer des valeurs à partir d'un partage des préférences immediatelyfrom une activité qui les a créés ..

ici est mon code pour la création du SharedPreference:

 public static final String USER_PREFERENCE_MODE = "USER_PREFERENCES_WEATHER"; 
     public static final String PREF_CITY_ENTRY = "PREF_CITY_ENTRY"; 
     public static final String PREF_TOGGLE_CELSIUS = "PREF_TOGGLE_CELSIUS"; 
     public static final String PREF_FREQ_UPDATE = "PREF_FREQ_UPDATE"; 

     SharedPreferences prefs; 

     public void onCreate(Bundle icicle) { 
      super.onCreate(icicle); 

        setContentView(R.layout.weather_view_configuration); 


      cityText =(EditText)findViewById(R.id.editCity_id); 
      chk_celsius = (CheckBox) findViewById(R.id.celsius_toggle_id); 
      save =(Button)findViewById(R.id.SaveButton); 
      update =(Spinner)findViewById(R.id.spinner_update_id); 

      cityText.setOnClickListener(this); 
      save.setOnClickListener(this); 

      prefs = this.getSharedPreferences(USER_PREFERENCE_MODE,0); 
      updateUIFromPreferences(); 
     } 

     @Override 
     public void onClick(View v) { 
      final Context context = WeatherForecastConfigure.this; 
      int selection = v.getId(); 

      switch(selection){ 
      case R.id.SaveButton: 
        savePreferences(); 

    prefs = getSharedPreferences(USER_PREFERENCE_MODE,0); 
RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.weather_appwidget); 
    String text = prefs.getString(WeatherForecastConfigure.PREF_CITY_ENTRY,null);  
       views.setTextViewText(R.id.weather_city_id, text); 
       AppWidgetManager widgetManager = AppWidgetManager.getInstance(context); 
            widgetManager.updateAppWidget(appWidgetID, views); 

      } 
     } 

     private void updateUIFromPreferences() { 
      String cityEntry = prefs.getString(PREF_CITY_ENTRY, cityText.getText().toString()); 
      boolean celsiusToggle = prefs.getBoolean(PREF_TOGGLE_CELSIUS, false); 
      int updateIndex = prefs.getInt(PREF_FREQ_UPDATE, 0); 

      cityText.setText(cityEntry); 
      update.setSelection(updateIndex); 
      chk_celsius.setChecked(celsiusToggle); 
     } 


     private void savePreferences() { 
      prefs = this.getSharedPreferences(USER_PREFERENCE_MODE,0); 

      int updateIndex = update.getSelectedItemPosition(); 
      boolean celsiusToggle = chk_celsius.isChecked(); 
      String city = cityText.getText().toString(); 


      Editor editor = prefs.edit(); 
      editor.putString(PREF_CITY_ENTRY, city); 
      editor.putBoolean(PREF_TOGGLE_CELSIUS, celsiusToggle); 
      editor.putInt(PREF_FREQ_UPDATE, updateIndex); 
      editor.commit(); 
     } 

Merci à l'avance

Voici mon code de service:

public class weatherForecast extends Service { 

    public static final String UPDATE = "update"; 
    int appWidgetID = AppWidgetManager.INVALID_APPWIDGET_ID; 

    String city; 
    Boolean chk_celsius; 
    SharedPreferences prefs; 

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

    public void onCreate(){ 
     Log.d(TAG, "onCreate"); 

prefs = getApplicationContext().getSharedPreferences(WeatherForecastConfigure.USER_PREFERENCE_MODE, 0); 

city = prefs.getString(WeatherForecastConfigure.PREF_CITY_ENTRY,""); 
chk_celsius = prefs.getBoolean(WeatherForecastConfigure.PREF_TOGGLE_CELSIUS, false); 

     Log.i(TAG, "city is " + city); 
    } 

    public void onStart(Intent intent, int startId){ 
     URL url; 
     Log.d(TAG,"onStart"); 


    Bundle extra = intent.getExtras(); 
    if(extra != null){ 
    appWidgetID = extra.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 

    Log.v("WIDGET_TAG_ID", "appWidgetId = " + appWidgetID); 
      } 

    /* prefs = this.getSharedPreferences("prefs", 0); 
    city = prefs.getString(WeatherForecastConfigure.PREF_CITY_ENTRY + appWidgetID,""); 
    chk_celsius = prefs.getBoolean(WeatherForecastConfigure.PREF_TOGGLE_CELSIUS, false); 
      Log.i(TAG, "city is " + city);*/ 


     RemoteViews updateViews = buildUpdate(this); 
     ComponentName thisWidget = new ComponentName(this, WeatherWidgetProvider.class); 
     AppWidgetManager widgetManager = AppWidgetManager.getInstance(this); 
     widgetManager.updateAppWidget(thisWidget, updateViews); 


     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
      super.onStart(intent, startId); 
     } 

    public RemoteViews buildUpdate(Context context) { 
    GoogleWeatherHandler gwh = new GoogleWeatherHandler(); 
    WeatherSet weather = gwh.getWeatherSet(); 
    RemoteViews remote = RemoteViews(context.getPackageName(), R.layout.weather_appwidget); 
    AppWidgetManager widgetManager = AppWidgetManager.getInstance(this); 
    remote.setTextViewText(R.id.editCity_id,weather.getCondition().getCity().toString()); 
remote.setTextViewText(R.id.weather_condition_id,weather.getCondition().getCondition().toString()); 
remote.setTextViewText(R.id.weather_tempreture_id,weather.getCondition().getTempCelcius().toString()); 

widgetManager.updateAppWidget(appWidgetID, views); 
    return views; 
    } 
} 
+0

Sur le premier problème - il semble qu'il ne trouve pas un fichier appelé /data/.../USER_PREFERENCE_WEATHER.xml.bak. Avez-vous (à tout moment) créé manuellement une copie du fichier xml en lui donnant l'extension .bak, puis l'avez supprimée manuellement plus tard? – Squonk

+0

désolé..je viens de voir votre commentaire. Non, je n'ai jamais rien fait de tel. J'ai récemment créé une application qui utilisait le nom USER_PREFERENCE et j'ai utilisé le même schéma de nom pour cette application. mais quand j'ai continué à obtenir la même erreur, je l'ai maintenant changé à ce qu'il est actuellement (USER_PREFERENCE_WEATHER) .. mais j'ai toujours le même problème. – irobotxxx

Répondre

0

Il semble lik Votre code est pris dans une sorte de «problème circulaire» faute d'un meilleur terme.

Par exemple, vous appelez

updateUIFromPreferences(); 

qui ne

String cityEntry = prefs.getString(PREF_CITY_ENTRY, cityText.getText().toString()); 
cityText.setText(cityEntry); 

alors votre bouton Enregistrer qui ne

String city = cityText.getText().toString(); 
editor.putString(PREF_CITY_ENTRY, city); 

Si vous ne définissez jamais cityText avec une valeur réelle vous passez simplement une valeur nulle dans les préférences. Je ne peux pas être sûr sans toute l'activité, mais c'est ce que le problème est de l'apparence de celui-ci.

+0

désolé pour la réponse tardive .. mais quand j'essaye d'accéder à la préférence partagée d'un service ou d'une classe de fournisseur appWidget, j'obtiens les valeurs comme nulles, que je ne comprends pas. Au fait, c'est à peu près toute l'activité que j'ai ici. – irobotxxx

+0

ce que je voulais dire était .. le updateFromPreference est appelé sur la méthode oncreate. Donc, après avoir entré une valeur et l'enregistrer, il charge réellement. mais à partir d'un autre service ou de la classe appWidget, j'obtiens null. – irobotxxx

+0

Ensuite, vous devriez poster votre code de services. – user432209

Questions connexes