Android 从DialogInterface.OnClickListener中开始startActivityForResult

Android 从DialogInterface.OnClickListener中开始startActivityForResult,android,android-intent,android-fragments,android-camera-intent,Android,Android Intent,Android Fragments,Android Camera Intent,我正在尝试实现一个带有选项的对话框。每个选项都将使用startActivityForResult启动一个活动,对话框片段将使用onActivityResult处理响应 到目前为止,我得到的是这样的东西: class ChoiceFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Build

我正在尝试实现一个带有选项的对话框。每个选项都将使用
startActivityForResult
启动一个活动,
对话框片段
将使用
onActivityResult
处理响应

到目前为止,我得到的是这样的东西:

class ChoiceFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setItems(sources, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                if (which == 0) {
                    Intent intent = new Intent(SomeActivity.class);
                    startActivityForResult(intent, 0);
                }
                dialog.dismiss();
            }
        });

        return builder.create();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        // This never gets called
    }
}
ChoiceFragment frag = new ChoiceFragment();
frag.show(getFragmentManager(), "choices");
在我的活动中,我开始这样的片段:

class ChoiceFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setItems(sources, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                if (which == 0) {
                    Intent intent = new Intent(SomeActivity.class);
                    startActivityForResult(intent, 0);
                }
                dialog.dismiss();
            }
        });

        return builder.create();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        // This never gets called
    }
}
ChoiceFragment frag = new ChoiceFragment();
frag.show(getFragmentManager(), "choices");
从注释中可以看到,未调用ActivityResult

我在几个问题中看到过这个场景,但它们似乎都假设主活动也在调用onActivityResult,或者片段被称为
getActivity().startActivityForResult()
,在我的例子中这两个都不是真的。

点击!
这就是答案。

ChoiceFragment.java:

package com.example.AndroidTest;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

/**
 * @autor Sergey Shustikov
 */
class ChoiceFragment extends DialogFragment {

    private CharSequence[] sources = new CharSequence[]{"Second"};

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setItems(sources, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                if (which == 0) {
                    Intent intent = new Intent(getActivity(),SecondActivity.class);
                    getActivity().startActivityForResult(intent, 0);
                }
                dialog.dismiss();
            }
        });

        return builder.create();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d("ResultA","This is choice");
        super.onActivityResult(requestCode, resultCode, data);
    }
}
package com.example.AndroidTest;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class MyActivity extends Activity {
    private ChoiceFragment frag;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        frag = new ChoiceFragment();
        fragmentTransaction.add(frag,"choices");
        fragmentTransaction.commit();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d("ResultA", "This is HostActivity");
        super.onActivityResult(requestCode, resultCode, data);
            frag.onActivityResult(requestCode, resultCode, data);
    }
}
package com.example.AndroidTest;

import android.app.Activity;
import android.os.Bundle;

/**
 * @autor Sergey Shustikov
 */
public class SecondActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}
MainActivity.java:

package com.example.AndroidTest;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

/**
 * @autor Sergey Shustikov
 */
class ChoiceFragment extends DialogFragment {

    private CharSequence[] sources = new CharSequence[]{"Second"};

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setItems(sources, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                if (which == 0) {
                    Intent intent = new Intent(getActivity(),SecondActivity.class);
                    getActivity().startActivityForResult(intent, 0);
                }
                dialog.dismiss();
            }
        });

        return builder.create();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d("ResultA","This is choice");
        super.onActivityResult(requestCode, resultCode, data);
    }
}
package com.example.AndroidTest;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class MyActivity extends Activity {
    private ChoiceFragment frag;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        frag = new ChoiceFragment();
        fragmentTransaction.add(frag,"choices");
        fragmentTransaction.commit();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d("ResultA", "This is HostActivity");
        super.onActivityResult(requestCode, resultCode, data);
            frag.onActivityResult(requestCode, resultCode, data);
    }
}
package com.example.AndroidTest;

import android.app.Activity;
import android.os.Bundle;

/**
 * @autor Sergey Shustikov
 */
public class SecondActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}
SecondActivity.java:

package com.example.AndroidTest;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

/**
 * @autor Sergey Shustikov
 */
class ChoiceFragment extends DialogFragment {

    private CharSequence[] sources = new CharSequence[]{"Second"};

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setItems(sources, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                if (which == 0) {
                    Intent intent = new Intent(getActivity(),SecondActivity.class);
                    getActivity().startActivityForResult(intent, 0);
                }
                dialog.dismiss();
            }
        });

        return builder.create();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d("ResultA","This is choice");
        super.onActivityResult(requestCode, resultCode, data);
    }
}
package com.example.AndroidTest;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class MyActivity extends Activity {
    private ChoiceFragment frag;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        frag = new ChoiceFragment();
        fragmentTransaction.add(frag,"choices");
        fragmentTransaction.commit();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d("ResultA", "This is HostActivity");
        super.onActivityResult(requestCode, resultCode, data);
            frag.onActivityResult(requestCode, resultCode, data);
    }
}
package com.example.AndroidTest;

import android.app.Activity;
import android.os.Bundle;

/**
 * @autor Sergey Shustikov
 */
public class SecondActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

我想你忘了在托管活动中覆盖
onActivityResult
。但是我的托管活动根本没有调用
onActivityResult
super.onActivityResult(…)
?我刚才不是说托管活动没有调用
onActivityResult