I'd like to know how to receive a result from an Image Picker flow in a DialogPreference.
I'd like for the DialogPreference
to get called after onActivityResult
so it can use the Uri
location of the selected image to show as an image preview to the User in their dialog before hitting ok/cancel.
Maybe I need to set something at the end of onActivityResult
and then call a lifecycle hook in DialogPreference
, but I am not sure.
So far the logic is like this:
ImagePreference.java
public class ImagePreference extends DialogPreference {
View mView;
public ImagePreference(Context context, AttributeSet attrs) {
super(context, attrs);
initWith(context, attrs);
}
private void initWith(Context context, AttributeSet attrs) {
setWidgetLayoutResource(R.layout.pref_image_widget);
setDialogLayoutResource(R.layout.pref_image_dialog);
}
@Override
protected View onCreateDialogView() {
mView = super.onCreateDialogView();
ImageButton button = (ImageButton) mView.findViewById(R.id.add_image);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((SettingsContract.SelectImage)getContext()).fromGallery();
}
});
return mView;
}
SettingsActivity.java
public class SettingsActivity extends AppCompatActivity
implements SettingsContract.SelectImage {
private static final int PICK_IMAGE_REQUEST = 1;
// ...
@Override
public void fromGallery() {
Intent intent = new Intent();
// Show only images, no videos or anything else
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
// Always show the chooser (if there are multiple options available)
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
Uri uri = data.getData();
// what to do here??
}
}