21

从一个活动中,我可以轻松地设置onActivityResult()和调用startActivityForResult(),一切正常。

现在,我需要startActivityForResult()从对话框中调用。但我无法设置onActivityResult(),我相信Dialog不是Activity.

我如何得到结果?

我在对话框中尝试这样的事情,但失败了。

//create new Intent
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, m_PicUri);
((Activity) getContext()).startActivityForResult(intent, Const.TAKE_PIC_ACTIVITY_RET_CODE);
4

5 回答 5

6

你可以声明你Activity有一个Dialog主题。看看这个 SO 问题:Android Activity as a dialog

您将在AndroidManifest.xml文件中更改此内容:

<activity android:theme="@android:style/Theme.Dialog" />

您应该可以startActivityForResult()正常使用。我知道示例 Android 程序使用类似的东西来返回您从列表中BluetoothChat选择的蓝牙设备。Dialog

于 2012-07-23T06:36:00.810 回答
4

如果您的对话框是对话框片段,您可以使用

getActivity().startActivityForResult(intent);

通过这种方式,结果被发送到创建对话框的活动

于 2014-06-02T21:18:32.403 回答
3

您可以使用DialogFragment代替 Dialog。因为对话框次要于它的活动。当您使用 startActivityForResult() 启动活动时,您的对话框将被关闭

另一个使用回调的例子

创建接口

 public interface DialogCallback {
   void getResults(String results);
 }

创建对话框片段

public class DialogFragment extends DialogFragment {

DialogCallback dialogCallback;

public DialogFragment setCallBack(DialogCallback dialogCallback){
    this.dialogCallback = dialogCallback;
    return this;
}

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return super.onCreateDialog(savedInstanceState);
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.your_layout, container, false);
    return view;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onDismiss(DialogInterface dialog) {
    super.onDismiss(dialog);
    dialogCallback.getResults("hello");
}

}

在您的活动中

@Override
protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     new DialogFragment().setCallBack(dialogCallback).show(getFragmentManager(),"");
}

DialogCallback dialogCallback = new DialogCallback() {
    @Override
    public void getResults(String results) {
        if(results!=null){
            Log.e(TAG,results);
        }
    }
};

输出

当您关闭DialogFragment时,您将在Activity中看到“hello”日志

于 2014-09-17T02:50:36.353 回答
2

使用兼容性包,然后使用 DialogFragment 构建您的对话框

于 2011-11-20T20:54:16.017 回答
1

在对话框构造函数上传递父Activity的引用,然后你可以在对话框中这样使用,

parentActivity.startActivityForResult(intent, CODE);
于 2016-09-24T04:17:07.583 回答