我有片段组件上的点击弹出窗口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的参数。 如果有人有兴趣在这里工作的样品。
创建简单的监听器
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只是字符串常量我放在那里只是对话
SOME_CLICKABLE.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager manager = getFragmentManager();
ListDialogFragment dialog = ListDialogFragment.newInstance(mPersona, getTag());
dialog.show(manager, DIALOG);
}
});
它是在大多数情况下需要使一个Fragment
知道它是一个的上下文中运行的Activity
的一些描述和使儿童片段上可接受的调用方法隐含地由父活动实现的(通过在铸造所证明的界面上您的代码段)。 当你得到你的推荐工作作为托马斯指出你是金色的。
然而,:)帮助对话片段,我建议你利用的可重用性BroadcastReceiver
秒。 一个BroadcastReceiver只是广播消息,说我做“X”。 然后父活动或实际上任何其它顶级组件可以宣布,我听的“X”。 有一次,该事件已在对话框组件发射,本次活动将通过父活动的收集onReceive
在那里你可以运行所需的代码更新您的领域。
就个人而言,我更喜欢在铸造界面方法,这松耦合的,因为它迫使我想每一个片段的目的,并保持它的模块化。
如果你想给它一个镜头则有超过上BroadcastReceivers开发指南部分读取,并按照如下步骤;
实施BroadcastReceiver
在你的父活动。 注意到一个onReceive
要求的方法来实现。
重写父活动的onResume
方法和注册的活性作为接收意图动作“等等”的事件的。 就像是;
@Override protected void onResume() { super.onResume(); registerReceiver(this, new IntentFilter("blah")); }
覆盖父活动的onPause
方法的注销活动为接收器,以避免“漏接收机”(你会发现)。
@Override protected void onPause() { super.onPause(); unregisterReceiver(deleteSpotReceiver); }
在您的DialogFragment
onClick
火,你的父母活动是“听”的事件。
@Override public void onClick(DialogInterface dialog, int item) { updateSharedPreference(item); Log.e("ProfilePersonaListDialog", "Click on dialog, inside onClick"); final Intent intent = new Intent(); intent.setAction("blah"); getActivity().sendBroadcast(intent); dismiss(); }
父活动将收集的信息,您可以继续处理。 让我知道,如果你决定采用该方法。
现在的样子,你做到了以上,并添加某事像,在您的活动:
public void onDialogListSelection() {
AnotherFragment anotherFragment = (AnotherFragment) getSupportFragmentManager()
.findFragmentById(R.id.anotherFragment);
anotherFragment.customMethodToNotifyListHasBeenSelected();
}
当然,如果你不使用支持库,然后调用getFragmentManager
代替getSupportFragmentManager
。