启动对话框以获得结果以将值返回到主活动

时间:2013-10-10 13:10:31

标签: android dialog fragment

我一直试图让我的头脑在这几个小时。

我有一个主要的Fragment类,然后从我在该类中的ImageView设置的onClick中,我启动了一个带有简单“是”或“取消”选项的Dialog Fragment。

我如何制作它,以便当用户点击“确定”时,它会将结果代码发送回我的主片段,告诉它运行一些代码(在我的情况下,我正在设置壁纸)。

这听起来简单但似乎无法弄明白。提前谢谢。

Onclick我希望以某种方式将结果返回到:

@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;

    }
}

3 个答案:

答案 0 :(得分:7)

在您的活动中,添加一个响应正在按下的确定按钮的方法,例如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();
}

答案 1 :(得分:2)

我知道这是一个古老的问题,但接受的答案似乎很可疑;特别是第一种方法。使用此方法会在MyDialogFragmentMyActivity之间引入紧密耦合,从而基本上无法使用FragmentFragment应该只知道它附加到Activity,而不是ActivityActivity

虽然第二种方法 不好,但考虑到你的Fragment已经知道它会使用哪种interface,我仍然认为有更好的方法使用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(); } }; } }

interface

然后,您可以在任何Activity中实施public class MyActivity extends AppCompatActivity implements MyDialogFragment.OnOkButtonClickListener { @Override public void onOkButtonClick() { // TODO: handle dialog click } // ... }

Fragment

这也是与developer training site上的{{1}}进行通信的推荐方法。

答案 2 :(得分:0)

您可以尝试使用Otto(或EventBus)通过“事件”从对话框向MainActivity发送事件 奥托:http://square.github.io/otto/ EventBus:https://github.com/greenrobot/EventBus