Search code examples
androidrefreshfragmentandroid-dialogfragment

Update fragment on dialog fragment option selection


I have fragment that on a component click pop-ups DialogFragment. This dialog fragment holds list of options. When an option from list is selected I want to notify fragment so I can run fields update procedure. I did something like this

@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();
}

However this getActivity() calls on FragmentActivity and not the fragment that triggered the dialog fragment. I could kill currently open/running fragment and call a new instance that would get updated fields, but that is dirty solution that I would prefer to avoid.

Any suggestions how to go about this update of fragment once option selected in dialog fragment?.


Solution

  • Just coming back with solution. My problem was actually forwarding current fragment getTag() string as parameter of show() for DialogFragment. If anyone interested here is working sample.

    Create simple listener

    public interface OnCloseListDialogListener {
        public void onDialogListSelection();
    }

    Create new dialog that will extend 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();
            }
        }
    }
    

    And then in fragment from which you wish to call this dialog do as bellow. DIALOG is just String constant I put there just 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);
        }
    });