2017-10-19 5 views
0

Ich verwende eine SharedPreference, um einen Zoom-Wert für eine Kameravorschau zu speichern. Wenn ich im SharedPreference-Menü den Zoom-Wert von dort ändere, funktioniert alles einwandfrei. Ich habe auch einen ScaleGestureDetector zur Einstellung dieses Zoom-Wertes implementiert.SharedPreference UI-Steuerelement nicht aktualisiert

Das Problem ist, wenn ich den Gesten-Detektor verwende, wenn ich in das SharedPreference-Menü gehe, hat es das Steuerelement nicht aktualisiert.

Die tatsächliche XML für die SharedPreference (PrefsFile.xml) aktualisiert hat -

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

jedoch die XML-Datei für den UI-Teil (package_preference.xml) noch auf den vorherigen Wert gesetzt ist -

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

ist mein Zuhörer ein Fragment innen -

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

    ... 
} 

Ibestätigenwird angerufen.

Ich hatte vorher editor.commit() aber ich dachte, editor.apply() hätte dieses Problem behoben, ist aber nicht.

+1

Gibt [diese Frage] (https://stackoverflow.com/questions/5652682/android-preferences-what-is-the-difference) Licht auf Ihr Problem? – Haem

Antwort

0

So habe ich das jetzt funktioniert. Ich habe eine Methode zum Aktualisieren des Einstellungswerts erstellt, wenn das entsprechende Fragment, das die Einstellungsansicht anzeigt, unter onResume() vollständig verfügbar ist.

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

} 
Verwandte Themen