我正在创建一个自定义首选项,允许用户从库中选择图像。为此,我将Intent设置为启动中间半透明活动的Intent,然后使用ACTION_GET_CONTENT
启动活动,并在startActivityForResult
中保留用户所选内容的URI。
(实际上,我使用常量名称将文件保存到内部存储器中,并使用时间戳保留很长时间,但我认为这与我的问题无关。)
现在我想更新一个ImageView我在Preference子类的setWidget
空间中使用新选择的图像。自定义Preference类如何监听对自己的首选项键值的更改?
我在onBindView()
中设置了没有问题的图像,但只有在首选屏幕布局时才会调用此图像。我已经查看了各种内置首选项的来源,但没有一个有这个问题,因为它们都没有打开一个用于进行首选项选择的Activity。它们都有一个对话框,可以回调首选项,或在内部使用onClick()
执行操作。
但是,我无法想办法让用户在不使用ACTION_GET_CONTENT
活动的情况下选择图库图片。
我知道我可以添加一个公共方法,然后在我的PreferenceActivity中使用OnSharedPreferenceChangedListener手动回调Preference来更新自己。但是我想将这个类放在一个库中以便在多个项目中使用(以后可能在一个开源库中发布),因此需要所有这些手动步骤非常难看。
答案 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();
}