v4片段中的Android onActivityResult无效

时间:2015-05-27 13:44:48

标签: android android-fragments android-support-library android-fragmentactivity onactivityresult

我在片段中尝试onActivityResult,目前我正在使用v4片段。

我的活动代码

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.v(tag, "0000");

    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
    super.onActivityResult(requestCode, resultCode, data);
}

我的片段代码

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.v(getTag(), "in 0");
    if (resultCode == Activity.RESULT_OK) {
        Log.v(getTag(), "in 1");
        if (requestCode == MY_INTENT_CLICK) {
            Log.v(getTag(), "in 2");
            if (null == data)
                return;

            Log.v(getTag(), "in 3");
            Uri selectedImageUri = data.getData(); } } }

我在

中调用启动Intent
Log.v(getTag(), "in 00");
                                    Intent intent = new Intent();
                                    Log.v(getTag(), "in 01");
                                    intent.setType("video/*");
                                    Log.v(getTag(), "in 02");
                                    intent.setAction(Intent.ACTION_GET_CONTENT);
                                    Log.v(getTag(), "in 03");
                                    fragment.startActivityForResult(Intent
                                            .createChooser(intent,
                                                    "Select a file"),
                                            MY_INTENT_CLICK);

我也尝试在

中调用intent
getActivity().startActivityForResult(Intent
                                            .createChooser(intent,
                                                    "Select a file"),
                                            MY_INTENT_CLICK);
startActivityForResult(Intent
                                            .createChooser(intent,
                                                    "Select a file"),
                                            MY_INTENT_CLICK);

但注意到的是工作。我也提到了。

Fragment Compatability onActivityResult() Not Working

onActivityResult is not being called in Fragment

onActivityResult() not called in new nested fragment API

1 个答案:

答案 0 :(得分:0)

参考下面的代码

public class RegisterDeRegisterResponse {

    private Vector<IResultResponse> _iCallBack = new Vector<IResultResponse>();
    public static RegisterDeRegisterResponse ref = null;

    public static RegisterDeRegisterResponse getInstance() {
        if (ref == null) {
            ref = new RegisterDeRegisterResponse();
        }
        return ref;
    }
    /**
     * Register to recieve server response.
     */
    public void registerForServerResponse(IResultResponse callback) {
        _iCallBack.addElement(callback);
    }

    /**
     * Notify all registered users about server response with corresponding
     * process id.
     */
    public void notifyRegisteredUser(int requestCode, int resultCode,
            Intent data) {

        Enumeration<IResultResponse> enumeration = _iCallBack.elements();
        while (enumeration.hasMoreElements()) {
            IResultResponse callback = enumeration.nextElement();
            callback.onActivityResult(requestCode, resultCode, data);
        }
    }

    /**
     * Deregister to recieve server response
     */
    public void deRegisterForServerResponse(IResultResponse callback) {
        _iCallBack.removeElement(callback);
    }

}

并且还使具有onActivityResult方法声明的接口

public interface IResultResponse {

    public void onActivityResult(int requestCode, int resultCode, Intent data);

}

现在,在调用startActivityForResult的类中,将此行放在startActivityForResult之前,并实现IresultResonse

RegisterDeRegisterResponse register1 = RegisterDeRegisterResponse
                    .getInstance();
            register1.registerForServerResponse(this);

并在onActivityResult中取消注册

RegisterDeRegisterResponse
        .getInstance().deRegisterForServerResponse((IResultResponse)this);