вызов startActivityForResult () из неактивного класса и получение результата в существующем действии или фрагменте - PullRequest
0 голосов
/ 29 июня 2018

Мой класс IntentHelper

public class IntentHelper {

    private Activity activity;

    // Camera activity request code
    public static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
    //Gallery activity request code
    public static final int GALLERY_OPEN_IMAGE_REQUEST_CODE = 101;

    public IntentHelper(Activity activity){
        this.activity = activity;
    }

    /**
     * Launching gallery to get image
     */
    public void getGalleryImage(){

        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("scale", true);
        intent.putExtra("outputFormat",
                Bitmap.CompressFormat.JPEG.toString());

        activity.startActivityForResult(Intent.createChooser(intent, "Select Image"),GALLERY_OPEN_IMAGE_REQUEST_CODE);
    }
}

Я называю этот класс из фрагмента как:

IntentHelper intentHelper = new IntentHelper(getActivity());
intentHelper.getGalleryImage();

Моя цель галереи успешно открыта с этой логикой. Но:

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // following if condition is not executing
    if(requestCode == IntentHelper.GALLERY_OPEN_IMAGE_REQUEST_CODE)
    {
        if(resultCode == RESULT_OK){

            SnackbarHelper.showSnackBar("Image browsed sucessfully",getView());
            Toast.makeText(getContext(), "Image browsed successfully", Toast.LENGTH_SHORT).show();

        }
        else if(requestCode == RESULT_CANCELED){
            SnackbarHelper.showSnackBar("Image browsed cancelled",getView());
        }
    }
}

Я не знаю, почему это происходит. Мое намерение вызывается идеально и возвращает меня к той же активности, тогда почему это условие onActivityResult () не работает ???

Мой весь код в фрагменте. Но я не думаю, что это вызывает эту проблему

РЕДАКТИРОВАТЬ - РЕШЕНИЕ

Поскольку ответ @laalto верен. Я должен начать startActivityForResult () с экземпляром фрагмента.

Поэтому я изменил свой класс IntentHelper следующим образом:

public class IntentHelper {
/*
* Instead of Activity use Fragment
*/
private Fragment fragment;

// Camera activity request code
public static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
//Gallery activity request code
public static final int GALLERY_OPEN_IMAGE_REQUEST_CODE = 101;

public IntentHelper(Fragment fragment){
    this.fragment = fragment;
}

/**
 * Launching gallery to get image
 */
public void getGalleryImage()  {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("scale", true);
    intent.putExtra("outputFormat",
            Bitmap.CompressFormat.JPEG.toString());

    // Use fragment for startActivityForResult() to initiate.
    fragment.startActivityForResult(Intent.createChooser(intent, "Select Image"),GALLERY_OPEN_IMAGE_REQUEST_CODE);
}

}

IntentHelper инициируется как:

IntentHelper intentHelper = new IntentHelper(this);
intentHelper.getGalleryImage();

После этого все отлично работает !!!!

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Вам нужно позвонить super.onActivityResult(requestCode, resultCode, data); в onActivityResult() действия, в котором находится фрагмент до того, как сам фрагмент может получить onActivityResult() сделанных триггеров. Просто добавьте в свою активность следующее:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}
0 голосов
/ 29 июня 2018

Мой весь код в фрагменте. Но я не думаю, что это вызывает эту проблему

Это проблема.

Если вы позвоните Activity#startActivityForResult(), вы получите onActivityResult в действии.

Если вы позвоните Fragment#startActivityForResult(), вы получите onActivityResult в этом фрагменте.

(Как это делается изнутри: FragmentActivity кодирует индекс фрагмента в код запроса для тех вызовов, где результат должен идти во фрагмент.)

Таким образом, вызов startActivityForResult() в действии и ожидание увидеть результат во фрагменте не работает. Либо переместите запрос во фрагмент, либо обработайте ответ в действие.

Кроме того, если вы не обрабатываете результат, передайте его реализации super.

0 голосов
/ 29 июня 2018

Я думаю, вы можете попробовать это в onActivityResult вашей деятельности, вызвать super.onActivityResult ()

и фрагмент в своем фрагменте убедитесь, что вы звоните

startActivityForResult(intent,111); instead of getActivity().startActivityForResult(intent,111); inside your fragment.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...