【问题标题】:inside Android Dialog, how to setup onActivityResult for startActivityForResult?在 Android Dialog 中,如何为 startActivityForResult 设置 onActivityResult?
【发布时间】:2023-03-23 16:57:01
【问题描述】:

通过活动,我可以轻松设置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);

【问题讨论】:

  • 请提供创建和启动对话框的代码。
  • @tony-p-lee 任何解决方案

标签: android android-activity android-dialog


【解决方案1】:

您可以将Activity 声明为具有Dialog 主题。看看这个 SO 问题:Android Activity as a dialog

您可以在 AndroidManifest.xml 文件中更改此设置:

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

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

【讨论】:

  • 这应该被标记为答案。无论如何,这是做你所期望的唯一方法。
  • 这不是答案。问题是“如何从对话框中启动ActivityForResult()”。但不是“如何将活动声明为对话框。”
【解决方案2】:

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

getActivity().startActivityForResult(intent);

以这种方式将结果发送到创建对话框的活动

【讨论】:

    【解决方案3】:

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

    另一个使用回调的示例

    创建接口

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

    创建DialogFragment

    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 时,您将看到 "hello" 登录您的 Activity

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        parentActivity.startActivityForResult(intent, CODE);
        

        【讨论】:

          猜你喜欢
          • 2012-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多