onActivityResult не вызывается во фрагменте - PullRequest
797 голосов
/ 27 мая 2011

Активности, в которой размещен этот фрагмент, вызывается onActivityResult, когда возвращается активность камеры.

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

ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, 1888);
    }
});

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if( requestCode == 1888 ) {
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        ((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);
    }
}

Ответы [ 32 ]

10 голосов
/ 24 декабря 2014

Я также встретил эту проблему во фрагменте.И я позвонил startActivityForResult в DialogFragment.

Но теперь эта проблема решена: FragmentClassname.this.startActivityForResult.

6 голосов
/ 14 декабря 2015

В моем случае это была ошибка Android (http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-fragments-android/),, если вы используете поддерживаемый FragmentActivity, вы должны использовать getSupportFragmentManager вместо getChildFragmentManager:

List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments != null) {
    for (Fragment fragment : fragments) {
        if(fragment instanceof UserProfileFragment) {
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }
}
6 голосов
/ 18 декабря 2014

Решение 1:

Звоните startActivityForResult(intent, REQUEST_CODE); вместо getActivity().startActivityForResult(intent, REQUEST_CODE);.

Решение 2:

Когда вызывается startActivityForResult(intent, REQUEST_CODE);, вызывается действие onActivityResult(requestCode,resultcode,intent), и тогда вы можете позвонить fragments onActivityResult() отсюда, передав requestCode, resultCode and intent.

5 голосов
/ 18 июля 2014

Короче говоря,

Во фрагменте объявляем Fragment fragment = this;

после этого использования fragment.startActivityForResult.

Результат вернется в ActivityResult.

5 голосов
/ 17 ноября 2015

для вложенных фрагментов (например, при использовании ViewPager)

В вашей основной деятельности:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}

В вашем основном фрагменте верхнего уровня (фрагмент ViewPager):

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    YourFragment frag = (YourFragment) getChildFragmentManager().getFragments().get(viewPager.getCurrentItem());
    frag.yourMethod(data);  // Method for callback in YourFragment
    super.onActivityResult(requestCode, resultCode, data);
}

In YourFragment (вложенный фрагмент):

public void yourMethod(Intent data){
    // Do whatever you want with your data
}
5 голосов
/ 23 декабря 2014

Внутри вашего фрагмента вызовите

this.startActivityForResult(intent, REQUEST_CODE);

, где this относится к фрагменту.В противном случае сделайте так, как сказал @Clevester:

Fragment fragment = this;
....
fragment.startActivityForResult(intent, REQUEST_CODE);

Мне также пришлось вызвать

super.onActivityResult(requestCode, resultCode, data);

в родительской активности onActivityResult, чтобы заставить ее работать.адаптировал этот ответ из ответа @ Clevester.)

4 голосов
/ 08 июня 2014

В большинстве этих ответов постоянно говорится, что вы должны позвонить super.onActivityResult(...) на вашем хосте Activity для вашего Fragment.Но, похоже, это не сработало для меня.

Итак, на вашем хосте Activity вы должны вместо этого позвонить вашему Fragments onActivityResult(...).Вот пример.

public class HostActivity extends Activity {

    private MyFragment myFragment;

    protected void onActivityResult(...) {
        super.onActivityResult(...);
        this.myFragment.onActivityResult(...);
    }
}

В какой-то момент в вашем HostActivity вам нужно будет присвоить this.myFragment Fragment, который вы используете.Или используйте FragmentManager, чтобы получить Fragment вместо того, чтобы хранить ссылку на него в своем HostActivity.Кроме того, проверьте на null, прежде чем пытаться позвонить на this.myFragment.onActivityResult(...);.

3 голосов
/ 27 октября 2015

Если с вышеуказанной проблемой сталкиваются при логине Facebook , то вы можете использовать приведенный ниже код в родительской активности вашего фрагмента, например:

Fragment fragment = getFragmentManager().findFragmentById(android.R.id.tabcontent);
fragment.onActivityResult(requestCode, resultCode, data);

Или:

Fragment fragment = getFragmentManager().findFragmentById("fragment id here");
fragment.onActivityResult(requestCode, resultCode, data);

И добавьте приведенный ниже вызов в свой фрагмент ...

callbackManager.onActivityResult(requestCode, resultCode, data);
3 голосов
/ 31 марта 2015
  1. Вы можете просто переопределить BaseActivity onActivityResult для фрагмента baseActivity.startActivityForResult.

  2. В BaseActivity добавить интерфейс и переопределить onActivityResult.

    private OnBaseActivityResult baseActivityResult;
    public static final int BASE_RESULT_RCODE = 111;
    public interface OnBaseActivityResult{
        void onBaseActivityResult(int requestCode, int resultCode, Intent data);
       }
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(getBaseActivityResult() !=null && requestCode == BASE_RESULT_RCODE){
        getBaseActivityResult().onBaseActivityResult(requestCode, resultCode, data);
        setBaseActivityResult(null);
    }
    
  3. On Fragment реализует OnBaseActivityResult

    @Override
    public void onBaseActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d("RQ","OnBaseActivityResult");
    if (data != null) {
        Log.d("RQ","OnBaseActivityResult + Data");
        Bundle arguments = data.getExtras();
      }
    }
    

Этот обходной путь поможет.

3 голосов
/ 08 апреля 2013
public class takeimage extends Fragment {

    private Uri mImageCaptureUri;
    private static final int PICK_FROM_CAMERA = 1;
    private static final int PICK_FROM_FILE = 2;
    private String mPath;
    private ImageView mImageView;
    Bitmap bitmap = null;
    View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.activity_send_image, container, false);
        final String[] items = new String[] { "From Camera", "From SD Card" };
        mImageView = (ImageView)view.findViewById(R.id.iv_pic);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.select_dialog_item, items);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Select Image");

        builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                if (item == 0) {
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    File file = new File(Environment.getExternalStorageDirectory(), "tmp_avatar_"
                        + String.valueOf(System.currentTimeMillis())
                        + ".jpg");
                    mImageCaptureUri = Uri.fromFile(file);

                    try {
                        intent.putExtra(
                            android.provider.MediaStore.EXTRA_OUTPUT,
                            mImageCaptureUri);
                        intent.putExtra("return-data", true);

                        getActivity().startActivityForResult(intent,
                            PICK_FROM_CAMERA);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    dialog.cancel();
                } else {
                    Intent intent = new Intent();

                    intent.setType("image/*");
                    intent.setAction(Intent.ACTION_GET_CONTENT);

                    getActivity().startActivityForResult(
                        Intent.createChooser(intent,
                            "Complete action using"), PICK_FROM_FILE);
                }
            }
        });
        final AlertDialog dialog = builder.create();

        Button show = (Button) view.findViewById(R.id.btn_choose);
        show.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // Switch the tab content to display the list view.
                dialog.show();
            }
        });

    return view;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (resultCode != Activity.RESULT_OK)
            return;

        if (requestCode == PICK_FROM_FILE) {
            mImageCaptureUri = data.getData();
            // mPath = getRealPathFromURI(mImageCaptureUri); //from Gallery

            if (mPath == null)
                mPath = mImageCaptureUri.getPath(); // from File Manager

            if (mPath != null)
                bitmap = BitmapFactory.decodeFile(mPath);
        } else {
            mPath = mImageCaptureUri.getPath();
            bitmap = BitmapFactory.decodeFile(mPath);
        }
        mImageView.setImageBitmap(bitmap);  
    }

    public String getRealPathFromURI(Uri contentUri) {
        String [] proj = {MediaStore.Images.Media.DATA};
        Cursor cursor = managedQuery(contentUri, proj, null, null,null);

        if (cursor == null) return null;

        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...