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