5

几个小时以来,我一直在努力解决这个问题。

我有一个主要的 Fragment 类,然后从我从该类中的 ImageView 设置的 onClick 开始,我使用简单的“是”或“取消”选项启动一个对话框片段。

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

这听起来很简单,但似乎无法弄清楚。提前致谢。

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;

    }
}
4

3 回答 3

8

在您的活动中,添加一个响应按下的 OK 按钮的方法,例如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();
}
于 2013-10-10T13:30:12.767 回答
2

我知道这是一个老问题,但接受的答案似乎很可疑;尤其是第一种方法。MyDialogFragment使用这种方法会在和之间引入紧密耦合MyActivity,基本上违背了使用Fragment. AFragment应该只知道它附加到 a Activity,而不知道它是什么类型的Activity

虽然第二种方法还不错,但考虑到您已经知道它将使用Activity哪种方法,我仍然认为使用以下方法有更好的方法:Fragmentinterface

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在 any中实现Activity

public class MyActivity extends AppCompatActivity
        implements MyDialogFragment.OnOkButtonClickListener {


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

    // ...

}

这也是Fragment开发人员培训网站上与 a 进行交流的推荐方法。

于 2016-09-20T19:42:57.197 回答
0

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

于 2015-09-23T05:23:56.963 回答