【问题标题】:SharedPreference UI control not updatedSharedPreference UI 控件未更新
【发布时间】:2017-10-19 09:59:09
【问题描述】:

我正在使用 SharedPreference 来存储相机预览的缩放值。 从 SharedPreference 菜单中,如果我从那里更改缩放值,一切正常。 我还实现了一个 ScaleGestureDetector 来设置这个缩放值。

问题是,在使用手势检测器时,当我进入 SharedPreference 菜单时,它并没有更新控件。

SharedPreference (PrefsFile.xml) 的实际 XML 已更新 -

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

但是 UI 部分的 XML 文件 (package_preference.xml) 仍然设置为之前的值 -

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

我的听众在一个片段内 -

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

    ...
}

我可以确认onScaleEnd() 正在被调用。

我之前有editor.commit(),但我认为editor.apply() 会解决这个问题,但没有。

【问题讨论】:

标签: android xml sharedpreferences


【解决方案1】:

所以我现在有这个工作。当显示首选项视图的相应片段在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()));

}

【讨论】:

    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    相关资源
    最近更新 更多