更新对话框片段选项选择的片段

时间:2012-05-08 16:54:14

标签: 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();
}

但是这个getActivity()调用FragmentActivity而不是调用触发对话框片段的片段。 我可以杀死当前打开/运行的片段并调用一个可以获得更新字段的新实例,但这是我希望避免使用的脏解决方案。

如何在对话框片段中选择如何更新片段一次选项?

3 个答案:

答案 0 :(得分:7)

回到解决方案。我的问题实际上是转发当前片段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只是字符串常量,我把它放在那里只是对话框


SOME_CLICKABLE.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        FragmentManager manager = getFragmentManager();
        ListDialogFragment dialog = ListDialogFragment.newInstance(mPersona, getTag());
        dialog.show(manager, DIALOG);
    }
});

答案 1 :(得分:6)

在大多数情况下,Fragment必须知道它在某个描述的Activity的上下文中运行,并且子层可以接受Fragment在隐式实现的接口上调用方法由父Activity(由代码片段中的强制转换演示)。当你得到你的参考资料时,托马斯指出你将是金色的。

但是,:)为了帮助重新使用对话框片段,我建议您使用BroadcastReceiver s。 BroadcastReceiver只是广播一条消息,上面写着我做'x'。然后,父活动或实际上任何其他顶级组件都可以声明我正在侦听'x'。一旦在对话框组件中触发了该事件,该事件将由父活动onReceive收集,您可以在其中运行必要的代码来更新您的字段。

在个人层面上,我更喜欢这种松散耦合而非铸造界面方法,因为它迫使我考虑每个片段的目的并保持模块化。

如果您想试一试,请阅读BroadcastReceivers上的开发指南部分并按照以下步骤操作;

  1. 在您的父活动中实施BroadcastReceiver。请注意,需要实施onReceive方法。

  2. 覆盖父Activity的onResume方法,并将活动注册为具有意图操作“blah”的事件的接收者。喜欢的东西;

     @Override
     protected void onResume() {
     super.onResume();
     registerReceiver(this, new IntentFilter("blah"));
    }
    
  3. 覆盖父Activity的onPause方法,取消注册活动作为接收者,以避免'泄露的接收者'(你会发现)。

    @Override
    protected void onPause() {
     super.onPause();
     unregisterReceiver(deleteSpotReceiver);
    }
    
  4. 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();
    }
    
  5. 父活动将收集消息,您可以继续处理。如果您决定采用该方法,请告诉我。

答案 2 :(得分:1)

就像你上面这样做的方式,并在你的活动中添加类似的东西:

public void onDialogListSelection() {
    AnotherFragment anotherFragment = (AnotherFragment) getSupportFragmentManager()
            .findFragmentById(R.id.anotherFragment);
    anotherFragment.customMethodToNotifyListHasBeenSelected();
}

当然,如果您不使用支持库,请拨打getFragmentManager而不是getSupportFragmentManager