package com.jdroid.android.dialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v7.app.AlertDialog; import java.io.Serializable; import java.util.List; public class ChoiceItemDialogFragment extends AbstractDialogFragment { public static final String ITEMS_EXTRA = "itemsExtra"; public static final String CURRENT_ITEM_EXTRA = "currentItemExtra"; public static final String RESOURCE_TITLE_ID_EXTRA = "resourceTitleId"; private List<ChoiceItem> values; private ChoiceItem selectedItem; /** * @param targetFragment The fragment that invokes the dialog * @param values The list must implements ChoiceItem * @param currentItem * @param resourceTitleId */ public static void show(Fragment targetFragment, List<? extends ChoiceItem> values, ChoiceItem currentItem, int resourceTitleId) { FragmentManager fm = targetFragment.getFragmentManager(); ChoiceItemDialogFragment fragment = new ChoiceItemDialogFragment(); Bundle bundle = new Bundle(); bundle.putSerializable(ITEMS_EXTRA, (Serializable)values); bundle.putSerializable(CURRENT_ITEM_EXTRA, currentItem); bundle.putInt(RESOURCE_TITLE_ID_EXTRA, resourceTitleId); fragment.setArguments(bundle); fragment.setTargetFragment(targetFragment, 0); if (fm.findFragmentByTag(ChoiceItemDialogFragment.class.getSimpleName()) == null) { fragment.show(fm, ChoiceItemDialogFragment.class.getSimpleName()); } } @NonNull @SuppressWarnings("unchecked") @Override public Dialog onCreateDialog(Bundle savedInstanceState) { values = (List<ChoiceItem>)getArguments().getSerializable(ITEMS_EXTRA); selectedItem = (ChoiceItem)getArguments().getSerializable(CURRENT_ITEM_EXTRA); int resourceTitleId = getArguments().getInt(RESOURCE_TITLE_ID_EXTRA); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(resourceTitleId); builder.setSingleChoiceItems(getAvailableItems(), values.indexOf(selectedItem), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ChoiceItemListener<ChoiceItem> listener = (ChoiceItemListener<ChoiceItem>)getTargetFragment(); if (values.get(which).equals(selectedItem)) { listener.onCurrentItemSelected(selectedItem); } else { listener.onNewItemSelected(values.get(which)); } dismiss(); } }); Dialog dialog = builder.create(); dialog.setCanceledOnTouchOutside(true); return dialog; } /** * @see android.support.v4.app.DialogFragment#onDestroyView() */ @Override public void onDestroyView() { // This is for rotation change, to preserve the dialog if ((getDialog() != null) && getRetainInstance()) { getDialog().setDismissMessage(null); } super.onDestroyView(); } private CharSequence[] getAvailableItems() { CharSequence[] availableModes = new CharSequence[values.size()]; for (int i = 0; i < values.size(); i++) { availableModes[i] = getString(values.get(i).getResourceTitleId()); } return availableModes; } }