Android 複数選択のチェックリストのダイアログを作る
意外と日本語情報がなかったので、書いておきます。
下記のようなダイアログを作ります。
;
public class DaySelectDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { mSelectedItems = new ArrayList(); // Where we track the selected // items boolean[] selected_days = new boolean[7]; selected_days[0] = true; //最初からチェックしておきたい項目をtrueにする AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); // Set the dialog title builder.setTitle(R.string.day_of_week) // Specify the list array, the items to be selected by // default (null for none), // and the listener through which to receive callbacks when // items are selected .setMultiChoiceItems(R.array.dayOfWeeklist, selected_days, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { if (isChecked) { // If the user checked the item, add it // to the selected items mSelectedItems.add(which); } else if (mSelectedItems.contains(which)) { // Else, if the item is already in the // array, remove it mSelectedItems.remove(Integer.valueOf(which)); } } }) // Set the action buttons .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { // User clicked OK, so save the mSelectedItems // results somewhere // or return them to the component that opened the // dialog //mSelectedItems = [0, 1, 2] String type = "ON"; PutUtils.putAlarmDay(context, type, mSelectedItems); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { } }); return builder.create(); } }
OKをタップで
mSelectedItems
に選択した項目が、[0,1,2]という形で入ります。
んで、たとえばボタンをタップで上記のダイアログが開くようにします。
@Override public void onClick(View v) { Intent i; switch (v.getId()) { case R.id.day_of_week: DaySelectDialogFragment day_select_dialog = new DaySelectDialogFragment(); day_select_dialog.show(m_fm_manager, TAG); }
忘れずに、onCreateでFragmentManagerを作っておきます。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.setting_alarm); btnAutoDay = (Button) findViewById(R.id.day_of_week); btnAutoDay.setOnClickListener(this); context = this; m_fm_manager = getSupportFragmentManager(); }
下記のようなエラーが出てしまう場合は
The method getSupportFragmentManager() is undefined for the type SampleActivity
ActivityがFragmentActivityを継承しているか確認しましょう。
一番最初のDialogFragmentは、ほぼ下記のページのコピペです。