可以侦听首选项值更改的自定义首选项

时间:2017-09-09 01:19:19

标签: android sharedpreferences

我正在创建一个自定义首选项,允许用户从库中选择图像。为此,我将Intent设置为启动中间半透明活动的Intent,然后使用ACTION_GET_CONTENT启动活动,并在startActivityForResult中保留用户所选内容的URI。

(实际上,我使用常量名称将文件保存到内部存储器中,并使用时间戳保留很长时间,但我认为这与我的问题无关。)

现在我想更新一个ImageView我在Preference子类的setWidget空间中使用新选择的图像。自定义Preference类如何监听对自己的首选项键值的更改?

我在onBindView()中设置了没有问题的图像,但只有在首选屏幕布局时才会调用此图像。我已经查看了各种内置首选项的来源,但没有一个有这个问题,因为它们都没有打开一个用于进行首选项选择的Activity。它们都有一个对话框,可以回调首选项,或在内部使用onClick()执行操作。

但是,我无法想办法让用户在不使用ACTION_GET_CONTENT活动的情况下选择图库图片。

我知道我可以添加一个公共方法,然后在我的PreferenceActivity中使用OnSharedPreferenceChangedListener手动回调Preference来更新自己。但是我想将这个类放在一个库中以便在多个项目中使用(以后可能在一个开源库中发布),因此需要所有这些手动步骤非常难看。

1 个答案:

答案 0 :(得分:1)

您检查过RingtonePreference了吗?这将启动一个铃声选择器活动并通过将自己注册为PreferenceManager.OnActivityResultListener侦听器来处理结果,因此它将由拥有的Activity委派给它。

源代码中的选择代码段:

@Override
protected void onAttachedToHierarchy(PreferenceManager preferenceManager) {
    super.onAttachedToHierarchy(preferenceManager);

    preferenceManager.registerOnActivityResultListener(this);
    mRequestCode = preferenceManager.getNextRequestCode();
}

public boolean onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == mRequestCode) {

        if (data != null) {
            Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);

            if (callChangeListener(uri != null ? uri.toString() : "")) {
                onSaveRingtone(uri);
            }
        }

        return true;
    }

    return false;
}

编辑:

public class TestPreference extends Preference implements SharedPreferences.OnSharedPreferenceChangeListener {
    public TestPreference(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public TestPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TestPreference(Context context) {
        super(context);
    }

    @Override
    protected void onAttachedToHierarchy(PreferenceManager preferenceManager) {
        super.onAttachedToHierarchy(preferenceManager);
        getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if (key.equals(getKey())) {
            // Update myself
        }
    }
}

然后,您的活动会更新onActivityResult中的偏好设置:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    SharedPreferences preferences = getSharedPreferences("Name of shared preferences", MODE_PRIVATE);
    // OR use default
    // SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    preferences.edit().putString("custom_preference_key", "VALUE").apply();
}