2017-10-19 37 views
0

J'utilise SharedPreference pour stocker une valeur de zoom pour un aperçu de caméra. Dans le menu SharedPreference, si je change la valeur du zoom, tout fonctionne correctement. J'ai également implémenté un ScaleGestureDetector pour définir cette valeur de zoom. Le problème est, lorsque j'utilise le détecteur de mouvement, lorsque je vais dans le menu SharedPreference, il n'a pas mis à jour le contrôle.Contrôle de l'interface utilisateur SharedPreference non mis à jour

Le XML réel pour le SharedPreference (PrefsFile.xml) a mis à jour -

<float name="Zoom Area" value="1.0" /> 

Cependant, le fichier XML pour la partie de l'interface utilisateur (de package_preference.xml) est toujours fixé à la valeur précédente -

<string name="pref_zoom_area">0.7</string> 

Mon auditeur se trouve dans un fragment -

public class Camera2VideoFragment extends Fragment implements View.OnClickListener, FragmentCompat.OnRequestPermissionsResultCallback, View.OnTouchListener { 

    ... 

    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 

     @Override 
     public boolean onScale(ScaleGestureDetector detector) { 
      mScaleFactor *= detector.getScaleFactor(); 

      // Don't let the object get too small or too large. 
      mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 1.0f)); 

      return true; 
     } 

     @Override 
     public void onScaleEnd(ScaleGestureDetector detector) { 
      mParameters.set_zoom_area(mScaleFactor); 
      SharedPreferences settings = getActivity().getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 
      SharedPreferences.Editor editor = settings.edit(); 
      Log.d(TAG, "onScaleEnd() mParameters.get_zoom_area() = " + mParameters.get_zoom_area()); 
      editor.putFloat(getString(R.string.pref_zoom_area), mParameters.get_zoom_area()); 
      editor.apply(); 
     } 
    } 

    ... 
} 

Je peux confirmer onScaleEnd() est appelé.

J'avais auparavant editor.commit() mais je pensais que editor.apply() aurait corrigé ce problème mais ne l'a pas fait.

+1

[cette question] (https://stackoverflow.com/questions/5652682/android-preferences-what-is-the-difference) fait-elle la lumière sur votre problème? – Haem

Répondre

0

J'ai donc cela fonctionne maintenant. J'ai créé une méthode pour mettre à jour la valeur de préférence lorsque le fragment correspondant qui affiche la vue de préférence est entièrement disponible à onResume().

@Override 
public void onResume() { 
    super.onResume(); 
    getPreferenceScreen().getSharedPreferences() 
      .registerOnSharedPreferenceChangeListener(this); 
    updatePreferencesUI(); 
} 

public void updatePreferencesUI() { 
    ListPreference mListPreference; 

    // Some settings may have been changed from outside this fragment. Even though the 
    // SharedPreference itself may be updated, the UI controls for this fragment will need 
    // updating separately, otherwise the two groups would be out of sync. 
    CameraActivity cameraActivity = (CameraActivity) getActivity(); 

    mListPreference = (ListPreference) findPreference("pref_zoom_area"); 
    mListPreference.setValue(String.valueOf(cameraActivity.mParameters.get_zoom_area())); 

}