Android “结果”的“启动”对话框以将值返回主活动

Android “结果”的“启动”对话框以将值返回主活动,android,dialog,fragment,Android,Dialog,Fragment,几个小时以来,我一直在想这个问题 我有一个主片段类,然后从我在该类的ImageView中设置的onClick开始,我用一个简单的“Yes”或“Cancel”选项启动一个对话框片段 我该怎么做,当用户单击“Ok”时,它会将结果代码发送回我的主片段,告诉它运行一些代码(在我的例子中,我正在设置墙纸) 这听起来很简单,但似乎无法理解。提前谢谢 单击我希望以某种方式将结果返回到的位置: @Override public View onCreateView(LayoutInflater inflater,

几个小时以来,我一直在想这个问题

我有一个主片段类,然后从我在该类的ImageView中设置的onClick开始,我用一个简单的“Yes”或“Cancel”选项启动一个对话框片段

我该怎么做,当用户单击“Ok”时,它会将结果代码发送回我的主片段,告诉它运行一些代码(在我的例子中,我正在设置墙纸)

这听起来很简单,但似乎无法理解。提前谢谢

单击我希望以某种方式将结果返回到的位置:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    final View v = inflater.inflate(R.layout.image_detail_fragment,
            container, false);

    mImageView = (RecyclingImageView) v.findViewById(R.id.imageView);
    mImageView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {

            MyDialogFragment dialog = new MyDialogFragment();
            dialog.show(getActivity().getFragmentManager(),
                    "MyDialogFragment");

        }

        public void onDialogOKPressed() {

    ((ImageDetailFragment) (DialogFragment.this.getParentFragment()))
                    .onDialogOKPressed();
            dismiss();

        }
    });

    return v;
}
对话类:

class MyDialogFragment extends DialogFragment {
    private Button ButtonOk;
    private Button ButtonCancel;

    public MyDialogFragment() {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.prompt, container);
        ButtonOk = (Button) view.findViewById(R.id.button1);
        ButtonCancel = (Button) view.findViewById(R.id.button2);
        getDialog().setTitle("Set Wallpaper?");

        ButtonOk.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                                                ((MyDialogFragment)(DialogFragment.this.getActivity())).onDialogOKPressed();
                dismiss();


            }

        });

        ButtonCancel.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                MyDialogFragment.this.dismiss();

            }
        });

        return view;

    }
}

在“活动”中,添加一个响应按下“确定”按钮的方法,例如
public void onDialogOKPressed()
。然后,在DialogFragment中OK按钮的onClickListener中,执行以下操作:

public void onClick(View v){
    ((MyActivity)(DialogFragment.this.getActivity())).onDialogOKPressed();
    dismiss();
}
或者将新方法放入主片段并执行以下操作:

public void onClick(View v){
    ((MyMainFragment)(DialogFragment.this.getParentFragment())).onDialogOKPressed();
    dismiss();
}
您可以尝试使用Otto(或EventBus)通过“事件”从对话框向MainActivity发送事件 奥托:
EventBus:

我知道这是一个老问题,但公认的答案似乎有点可疑;特别是第一种方法。使用此方法将在
MyDialogFragment
MyActivity
之间引入紧密耦合,从根本上违背了使用
片段的目的。
片段
应该只知道它附加到
活动
,而不知道它是什么类型的
活动

虽然第二种方法没有那么糟糕,但考虑到您的
活动
已经知道它将使用哪种
片段
,我仍然认为有一种更好的方法使用
接口

public class MyDialogFragment extends DialogFragment {

    public interface OnOkButtonClickListener {
        void onOkButtonClick();
    }

    private OnOkButtonClickListener mOnOkButtonClickListener;

    private Button mOkButton;
    private Button mCancelButton;

    public static MyDialogFragment newInstance() {
        return new MyDialogFragment();
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        if(context instanceof OnOkButtonClickListener) {
            mOnOkButtonClickListener = (OnOkButtonClickListener) context;
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.prompt, container, false);
        getDialog().setTitle("Set Wallpaper?");

        mOkButton = (Button) view.findViewById(R.id.button1);
        mCancelButton = (Button) view.findViewById(R.id.button2);

        mOkButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mOnOkButtonClickListener != null) {
                    mOnOkButtonClickListener.onOkButtonClick();
                }
            }
        };

        mCancelButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MyDialogFragment.this.dismiss();
            }
        };
    }

}
然后,您可以在任何
活动
中实现
接口

public class MyActivity extends AppCompatActivity
        implements MyDialogFragment.OnOkButtonClickListener {


    @Override
    public void onOkButtonClick() {
        // TODO: handle dialog click
    }

    // ...

}

这也是与上的
片段进行通信的推荐方法。

那么我应该如何获取结果,以便主要活动知道是否执行我的代码?这就是我的问题:)这只是调用活动中的新方法。因此,从这个新方法执行代码。如果没有按下OK按钮,它将不会被调用。用结果代码去掉if/else块。看起来您正计划设置墙纸,因此在新方法中,设置墙纸。或者,您可以将新方法放入片段中,并将
((MyActivity)getActivity())
替换为
((MyFragment)getParentFragment())
。我将用什么替换“MyActivty”使用?不管你的活动名称是什么,它承载着片段。但实际上,像我上面评论的那样使用主片段类可能更容易,因为这可能是大多数墙纸代码所在的地方。因此,使用
((MyFragment)getParentFragment())
,将MyFragment替换为主片段类的名称。这不是答案。