pet*_*udo 7 android refresh fragment android-dialogfragment
我在组件上有片段单击弹出窗口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();
}
Run Code Online (Sandbox Code Playgroud)
但是这个getActivity()调用FragmentActivity而不是调用触发对话框片段的片段.我可以杀死当前打开/运行的片段并调用一个可以获得更新字段的新实例,但这是我希望避免的脏解决方案.
有关如何在对话框片段中选择的片段更新选项的任何建议吗?
刚刚回来解决方案.我的问题实际上是转发当前片段getTag()字符串作为DialogFragment的show()参数.如果有兴趣在这里工作样品.
创建简单的侦听器
public interface OnCloseListDialogListener {
public void onDialogListSelection();
}Run Code Online (Sandbox Code Playgroud)
创建将扩展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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在你希望调用此对话框的片段中如下所示.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);
}
});Run Code Online (Sandbox Code Playgroud)
这是在大多数情况下需要一个Fragment知道它的上下文中运行Activity的一些描述和孩子片段可以接受调用方法隐含父活动来实现(如投在你的代码所示的界面上片段).当你得到你的参考资料时,托马斯指出你将是金色的.
但是,:)为了帮助重新使用对话框片段,我建议你利用BroadcastReceivers.BroadcastReceiver只是简单地广播一条消息,说我做了'x'.然后,父活动或实际上任何其他顶级组件都可以声明我正在侦听'x'.一旦在对话框组件中触发了该事件,该事件将由父Activity收集onReceive,您可以在其中运行必要的代码来更新字段.
在个人层面上,我更喜欢这种松散耦合而非铸造界面方法,因为它迫使我思考每个片段的目的并保持模块化.
如果你想试一试,那么请阅读BroadcastReceivers上的开发指南部分并按照以下步骤操作;
实现BroadcastReceiver你的父活动.请注意,onReceive需要实现一种方法.
覆盖父Activity的onResume方法,并将活动注册为具有意图操作"blah"的事件的接收者.就像是;
@Override
protected void onResume() {
super.onResume();
registerReceiver(this, new IntentFilter("blah"));
}
Run Code Online (Sandbox Code Playgroud)覆盖父Activity的onPause方法,取消注册活动作为接收者,以避免'泄漏的接收者'(你会发现).
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(deleteSpotReceiver);
}
Run Code Online (Sandbox Code Playgroud)在您的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();
}
Run Code Online (Sandbox Code Playgroud)父活动将收集消息,您可以继续处理.如果您决定采用该方法,请告诉我.