我一直试图让我的头脑在这几个小时。
我有一个主要的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;
}
}
答案 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)
我知道这是一个古老的问题,但接受的答案似乎很可疑;特别是第一种方法。使用此方法会在MyDialogFragment
和MyActivity
之间引入紧密耦合,从而基本上无法使用Fragment
。 Fragment
应该只知道它附加到Activity
,而不是Activity
。Activity
。
虽然第二种方法 不好,但考虑到你的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