В Multi Image Selector метод OnActivityResult() не вызывается во фрагменте

Я пытаюсь сделать селектор изображений для приложения. Для этого я использую библиотеку multi-image-selector, которая прекрасно работает при использовании в деятельности, но здесь я хочу использовать ее во фрагменте. Так что во фрагменте метод OnActivityResult() не получается Кто-нибудь может помочь мне решить эту проблему?

Вот мой код:MainActivity.java:(Моя основная деятельность)

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_IMAGE = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getFragmentManager().beginTransaction().replace(R.id.frame, new Image_Selecter()).commit();

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //  Utilz.printLog("Parentactivity", "onActivityResult");
        Log.e("hererererer", "hererererer");
        if (requestCode == REQUEST_IMAGE) { 

          new Image().onActivityResult(requestCode, resultCode, data);
        }
    }
}

Изображение: (Мой фрагмент)

public class Image extends Fragment {
    private ArrayList<String> mSelectPath;
    private static final int REQUEST_IMAGE = 2;
    ArrayList<Uri> mMedia = new ArrayList<Uri>();
    Uri uri;
    ImageView img;
    protected static final int REQUEST_STORAGE_READ_ACCESS_PERMISSION = 101;

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_image, container, false);
        img = (ImageView) view.findViewById(R.id.img);
        img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                pickImage();
            }
        });

        return view;
    }
    public void pickImage() {
            MultiImageSelector selector = new MultiImageSelector(getActivity());
            selector.showCamera(true);
            selector.multi();
            selector.count(1);
            selector.origin(mSelectPath);
            selector.start(getActivity(), REQUEST_IMAGE);
        }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_IMAGE) {
            if (resultCode == getActivity().RESULT_OK) {
                mSelectPath = data.getStringArrayListExtra(MultiImageSelector.EXTRA_RESULT);
                mMedia.clear();
                for (String p : mSelectPath) {
                    Uri uri = Uri.parse(p);
                    mMedia.add(uri);
                }
                uri = mMedia.get(0);
                Log.e("uri", "  " + uri);
                if (!uri.toString().contains("content://")) {
                    uri = Uri.fromFile(new File(uri.toString()));
                    Log.e("in if", " uri = " + uri);
                }
                try {
                    Glide.with(this)
                            .load(uri)
                            .placeholder(R.mipmap.ic_launcher)
                            .error(R.mipmap.ic_launcher)
                            .into(img);
                } catch (Exception e) {
                    Log.e("Exceptionn", " " + e);
                }
            }
        }
    }

4 ответа

Попробуйте это в своей деятельности

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d("Parentactivity", "onActivityResult");

    if (requestCode == REQUEST_IMAGE) { //use request code as REQUEST_IMAGE while starting intent for camera

        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.frame);
        fragment.onActivityResult(requestCode, resultCode, data);//calling fragments onActivityResult here
    }
}

IIRC onActivityResult не вызывается для фрагмента, он вызывается для вашей родительской активности. Вам нужно поймать это в Деятельности и переслать результат во фрагмент.

Вы должны назвать это с намерением

public void pickImage() {
       Intent intent = new Intent(getContext(), MultiImageSelectorActivity.class);
       intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, true);
       intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, 1);
       intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, MultiImageSelectorActivity.MODE_MULTI);
       intent.putStringArrayListExtra(MultiImageSelectorActivity.EXTRA_DEFAULT_SELECTED_LIST, mSelectPath);
       startActivityForResult(intent, REQUEST_IMAGE);
}

если бы ты делал getActivity().startActivityForResult(intent, REQUEST_IMAGE);на OnActivityResult() будет происходить по активности вместо фрагмента. То, как вы используете это, так, поэтому вам нужно использовать намеренный способ.

также, что, возможно, заставит ваш код работать

public void pickImage() {
        MultiImageSelector selector = new MultiImageSelector(getContext());
        selector.showCamera(true);
        selector.multi();
        selector.count(1);
        selector.origin(mSelectPath);
        selector.start(getContext(), REQUEST_IMAGE);
}

Есть два метода, которые выглядят одинаково, но ведут себя немного иначе. Если метод вызывается из действия, он не будет давать обратный вызов фрагменту, если не вызван из фрагмента.

Activity.startActivityForResult()
Fragment.startActivityForResult()

Проверьте библиотеку, если есть способ вызвать ее из фрагмента.

Я не знаю библиотеку, просто представляю, если вы можете передать фрагмент MultiImageSelector selector = new MultiImageSelector(getActivity()); или же selector.start(getActivity(), REQUEST_IMAGE);

Удачи

Эмре

Другие вопросы по тегам