我在组件上有片段单击弹出窗口DialogFragment.该对话框片段包含选项列表.当选择列表中的选项时,我想通知片段,以便我可以运行字段更新过程.
我做了这样的事
我做了这样的事
@Override public void onClick(DialogInterface dialog,int item) { updateSharedPreference(item); Log.e("ProfilePersonaListDialog","Click on dialog,inside onClick"); OnCloseListDialogListener act = (OnCloseListDialogListener) getActivity(); act.onDialogListSelection(); dismiss(); }
但是这个getActivity()调用FragmentActivity而不是调用触发对话框片段的片段.
我可以杀死当前打开/运行的片段并调用一个可以获得更新字段的新实例,但这是我希望避免的脏解决方案.
有什么建议如何在对话框片段中选择片段一次更新选项?
解决方法
刚刚回来解决方案.我的问题实际上是转发当前片段getTag()字符串作为DialogFragment的show()参数.如果有兴趣在这里工作样品.
创建简单的侦听器
public interface OnCloseListDialogListener { public void onDialogListSelection(); }
创建将扩展DialogFragment的新对话框
public class ListDialogFragment extends DialogFragment implements DialogInterface.OnClickListener { private PersonaData[] mPersonaData; private String[] mPersonaName; private final String TAG; public static ListDialogFragment newInstance(PersonaData[] personaData,String tag) { ListDialogFragment dialog = new ListDialogFragment(personaData,tag); Bundle bundle = new Bundle(); dialog.setArguments(bundle); return dialog; } private ListDialogFragment(PersonaData[] personaData,String tag) { this.mPersonaData = personaData.clone(); this.TAG = tag; } @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); setCancelable(true); int style = DialogFragment.STYLE_NORMAL,theme = 0; setStyle(style,theme); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.dialog_title); mPersonaName = getData();//Your own implementation here builder.setNegativeButton("Cancel",this); builder.setSingleChoiceItems(mPersonaName,-1,new SingleChoiceListener()); return builder.create(); } @Override public void onClick(DialogInterface dialogInterface,int i) { } private class SingleChoiceListener implements DialogInterface.OnClickListener { @Override public void onClick(DialogInterface dialog,int item) { updateSharedPreference(item); OnCloseListDialogListener act = (OnCloseListDialogListener) getFragmentManager().findFragmentByTag(TAG); act.onDialogListSelection(); dismiss(); } } }
然后在你想要调用此对话框的片段中,如下所示. DIALOG只是String常量我把它放在那里只是对话框
SOME_CLICKABLE.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { FragmentManager manager = getFragmentManager(); ListDialogFragment dialog = ListDialogFragment.newInstance(mPersona,getTag()); dialog.show(manager,DIALOG); } });