DiarogFragmentをまとめてみた

このエントリーをはてなブックマークに追加

DialogFragmentについて、アプリを作成していてDialogはそこそこ使用するので、共通化できそうなものを共通化してみた。
毎度インナークラスを作成し、Activity側にメソッドを作成し、Fragment側で呼び出すのは面倒なので、DialogFragmentクラスを単体で作成し、Activity側でイベントリスナーを登録するようにしてみた。(これが良いやり方かどうかはわかりません。)
作成したダイアログは以下の7つ。

  • OKダイアログ
  • OKCancelダイアログ
  • SingleChoiceダイアログ
  • MultiChoiceダイアログ
  • EditTextダイアログ
  • SpinningProgressダイアログ
  • HorizontalProgressダイアログ

OKダイアログ

OKボタンのみが表示されるダイアログ、あんまり使用しないかなあ。ほとんどの場合Toast使うし。

device-2014-03-30-220205
以下ダイアログクラスのコード

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.os.Bundle;

public class OkDialog extends DialogFragment {
	public static OkDialog newInstance(int title, int message) {
		OkDialog fragment = new OkDialog();
		Bundle args = new Bundle();
		args.putInt("title", title);
		args.putInt("message", message);
		fragment.setArguments(args);

		return fragment;
	}

	@Override
	public Dialog onCreateDialog(Bundle safedInstanceState) {
		int title = getArguments().getInt("title");
		int message = getArguments().getInt("message");

		AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
		builder.setTitle(title)
		.setMessage(message)
		.setPositiveButton("OK", null);

		return builder.create();
	}
}

以下使い方

OkDialog dialogFragment = OkDialog
		.newInstance(R.string.app_name, R.string.dialog_message);
dialogFragment.show(getFragmentManager(), "dialog_fragment");

OKCancelダイアログ

OK、Cancelボタンが表示されるダイアログ。

device-2014-03-30-220221

以下ダイアログクラスのコード

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;

public class OkCancelDialog extends DialogFragment {
	private DialogInterface.OnClickListener okClickListener = null;
	private DialogInterface.OnClickListener cancelClickListener = null;

	public static OkCancelDialog newInstance(int title, int message) {
		OkCancelDialog fragment = new OkCancelDialog();
		Bundle args = new Bundle();
		args.putInt("title", title);
		args.putInt("message", message);
		fragment.setArguments(args);

		return fragment;
	}

	@Override
	public Dialog onCreateDialog(Bundle safedInstanceState) {
		int title = getArguments().getInt("title");
		int message = getArguments().getInt("message");

		AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
		builder.setTitle(title)
		.setMessage(message)
		.setPositiveButton("OK", this.okClickListener)
		.setNegativeButton("Cancel", this.cancelClickListener);

		return builder.create();
	}

	/**
     * OKクリックリスナーの登録
     */
	public void setOnOkClickListener(DialogInterface.OnClickListener listener) {
		this.okClickListener = listener;
	}

	/**
     * Cancelクリックリスナーの登録
     */
	public void setOnCancelClickListener(DialogInterface.OnClickListener listener) {
		this.cancelClickListener = listener;
	}
}

以下使い方

OkCancelDialog dialogFragment = OkCancelDialog
		.newInstance(R.string.app_name, R.string.dialog_message);
dialogFragment.setOnOkClickListener(new DialogInterface.OnClickListener() {
	@Override
	public void onClick(DialogInterface dialog, int which) {
		Toast.makeText(MainActivity.this, "OKがクリックされました", Toast.LENGTH_SHORT).show();
	}
});
dialogFragment.setOnCancelClickListener(new DialogInterface.OnClickListener() {
	@Override
	public void onClick(DialogInterface dialog, int which) {
		Toast.makeText(MainActivity.this, "Cancelがクリックされました", Toast.LENGTH_SHORT).show();
	}
});
dialogFragment.show(getFragmentManager(), "dialog_fragment");

SingleChoiceダイアログ

複数選択で1だけを選択するダイアログ、OKボタンはいらないかもしれないけど、一応。

device-2014-03-30-220234
以下ダイアログクラスのコード

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;

public class SingleChoiceDialog extends DialogFragment {
	private DialogInterface.OnClickListener singleChoiceClickListener = null;
	private DialogInterface.OnClickListener okClickListener = null;
	private DialogInterface.OnClickListener cancelClickListener = null;
	
	public static SingleChoiceDialog newInstance(int title, String[] items, int checkedItem) {
		SingleChoiceDialog fragment = new SingleChoiceDialog();
		Bundle args = new Bundle();
		args.putInt("title", title);
		args.putStringArray("items", items);
		args.putInt("checked_item", checkedItem);
		fragment.setArguments(args);
		
		return fragment;
	}
	
	@Override
	public Dialog onCreateDialog(Bundle safedInstanceState) {
		int title = getArguments().getInt("title");
		String[] items = getArguments().getStringArray("items");
		int checkedItem = getArguments().getInt("checked_item");
		
		AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
		builder.setTitle(title);
		builder.setSingleChoiceItems(items, checkedItem, this.singleChoiceClickListener)
		.setPositiveButton("OK", this.okClickListener)
        .setNegativeButton("Cancel", this.cancelClickListener);
		
		return builder.create();
	}
	
	/**
     * SingleChoiceクリックリスナーの登録
     */	
	public void setOnSingleChoiceClickListener(DialogInterface.OnClickListener listener) {
		this.singleChoiceClickListener = listener;
	}
	
	/**
     * OKクリックリスナーの登録
     */	
	public void setOnOkClickListener(DialogInterface.OnClickListener listener) {
		this.okClickListener = listener;
	}
	
	/**
     * Cancelクリックリスナーの登録
     */	
	public void setOnCancelClickListener(DialogInterface.OnClickListener listener) {
		this.cancelClickListener = listener;
	}
}

以下使い方

inal int checkedItem = 1;
SingleChoiceDialog dialogFragment = SingleChoiceDialog
		.newInstance(R.string.app_name, items, checkedItem);
dialogFragment.setOnSingleChoiceClickListener(new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
    	singleSelectItem = items[item];
    }
});
dialogFragment.setOnOkClickListener(new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
    	Toast.makeText(MainActivity.this, singleSelectItem + "が選択されました", Toast.LENGTH_SHORT).show();
    }
});
dialogFragment.setOnCancelClickListener(new DialogInterface.OnClickListener() {
	@Override
	public void onClick(DialogInterface dialog, int which) {
		Toast.makeText(MainActivity.this, "Cancelがクリックされました", Toast.LENGTH_SHORT).show();
	}
});
dialogFragment.show(getFragmentManager(), "dialog_fragment");

MultiChoiceダイアログ

複数選択で複数選択できるダイアログ。

以下ダイアログクラスのコード

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;

public class MultiChoiceDialog extends DialogFragment {
	private DialogInterface.OnMultiChoiceClickListener multiChoiceClickListener = null;
	private DialogInterface.OnClickListener okClickListener = null;
	private DialogInterface.OnClickListener cancelClickListener = null;
	
	public static MultiChoiceDialog newInstance(int title, String[] items, boolean[] checkedItems) {
		MultiChoiceDialog fragment = new MultiChoiceDialog();
		Bundle args = new Bundle();
		args.putInt("title", title);
		args.putStringArray("items", items);
		args.putBooleanArray("checked_items", checkedItems);
		fragment.setArguments(args);
		
		return fragment;
	}
	
	@Override
	public Dialog onCreateDialog(Bundle safedInstanceState) {
		int title = getArguments().getInt("title");
		String[] items = getArguments().getStringArray("items");
		boolean[] checkedItems = getArguments().getBooleanArray("checked_items");
		
		AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
		builder.setTitle(title);
		builder.setMultiChoiceItems(items, checkedItems, this.multiChoiceClickListener)
		.setPositiveButton("OK", this.okClickListener)
        .setNegativeButton("Cancel", this.cancelClickListener);
		
		return builder.create();
	}
	
	/**
     * MultiChoiceクリックリスナーの登録
     */	
	public void setOnMultiChoiceClickListener(DialogInterface.OnMultiChoiceClickListener listener) {
		this.multiChoiceClickListener = listener;
	}
	
	/**
     * OKクリックリスナーの登録
     */	
	public void setOnOkClickListener(DialogInterface.OnClickListener listener) {
		this.okClickListener = listener;
	}
	
	/**
     * Cancelクリックリスナーの登録
     */	
	public void setOnCancelClickListener(DialogInterface.OnClickListener listener) {
		this.cancelClickListener = listener;
	}
}

以下使い方

MultiChoiceDialog dialogFragment = MultiChoiceDialog
		.newInstance(R.string.app_name, items, multiSelectItems);
dialogFragment.setOnMultiChoiceClickListener(new DialogInterface.OnMultiChoiceClickListener() {
	@Override
	public void onClick(DialogInterface dialog, int which, boolean isChecked) {
		multiSelectItems[which] = isChecked;
	}
});
dialogFragment.setOnOkClickListener(new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
    	String selectItem = "";
    	for (int i = 0; i < items.length; i++) {
    		if (multiSelectItems[i]) {
    			selectItem += items[i];
    		}
    	}
    	Toast.makeText(MainActivity.this, selectItem + "が選択されました", Toast.LENGTH_SHORT).show();	
    }
});
dialogFragment.setOnCancelClickListener(new DialogInterface.OnClickListener() {
	@Override
	public void onClick(DialogInterface dialog, int which) {
		Toast.makeText(MainActivity.this, "Cancelがクリックされました", Toast.LENGTH_SHORT).show();
	}
});
dialogFragment.show(getFragmentManager(), "dialog_fragment");

EditTextダイアログ

EditTextを使用して、入力値を取得するダイアログ。

device-2014-03-30-220553

以下ダイアログクラスのコード

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.EditText;

public class EditTextDialog extends DialogFragment {
	private DialogInterface.OnClickListener okClickListener = null;
	private DialogInterface.OnClickListener cancelClickListener = null;
	private EditText editText;
	
	public static EditTextDialog newInstance(int title, int message) {
		EditTextDialog fragment = new EditTextDialog();
		Bundle args = new Bundle();
		args.putInt("title", title);
		args.putInt("message", message);
		fragment.setArguments(args);
		
		return fragment;
	}
	
	@Override
	public Dialog onCreateDialog(Bundle safedInstanceState) {
		int title = getArguments().getInt("title");
		int message = getArguments().getInt("message");
		
		AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
		builder.setTitle(title)
		.setMessage(message)
		.setView(this.editText)
		.setPositiveButton("OK", this.okClickListener)
		.setNegativeButton("Cancel", this.cancelClickListener);
		
		return builder.create();
	}
	
	/**
     * OKクリックリスナーの登録
     */	
	public void setOnOkClickListener(DialogInterface.OnClickListener listener) {
		this.okClickListener = listener;
	}
	
	/**
     * Cancelクリックリスナーの登録
     */	
	public void setOnCancelClickListener(DialogInterface.OnClickListener listener) {
		this.cancelClickListener = listener;
	}
	
	/**
     * EditTextの登録
     */	
	public void setEditText(EditText editText) {
		this.editText = editText;
	}
}

以下使い方

editText = new EditText(MainActivity.this);
editText.setText("デフォルト値");

EditTextDialog dialogFragment = EditTextDialog
		.newInstance(R.string.app_name, R.string.dialog_message);
dialogFragment.setOnOkClickListener(new DialogInterface.OnClickListener() {
	@Override
	public void onClick(DialogInterface dialog, int which) {
		Toast.makeText(MainActivity.this, editText.getText().toString() + "が入力されました", Toast.LENGTH_SHORT).show();
	}
});
dialogFragment.setOnCancelClickListener(new DialogInterface.OnClickListener() {
	@Override
	public void onClick(DialogInterface dialog, int which) {
		Toast.makeText(MainActivity.this, "Cancelがクリックされました", Toast.LENGTH_SHORT).show();
	}
});
dialogFragment.setEditText(editText);
dialogFragment.show(getFragmentManager(), "dialog_fragment");

SpinningProgressダイアログ

プログレスダイアログ、処理中であることを伝えるダイアログ。
device-2014-03-30-220612

以下ダイアログクラスのコード

import android.app.Dialog;
import android.app.DialogFragment;
import android.app.ProgressDialog;
import android.os.Bundle;

public class SpinningProgressDialog extends DialogFragment {
	private ProgressDialog progressDialog;
	
	public static SpinningProgressDialog newInstance(int title, int message) {
		SpinningProgressDialog fragment = new SpinningProgressDialog();
		Bundle args = new Bundle();
		args.putInt("title", title);
		args.putInt("message", message);
		fragment.setArguments(args);
		
		return fragment;
	}
	
	@Override
	public Dialog onCreateDialog(Bundle safedInstanceState) {
		int title = getArguments().getInt("title");
		int message = getArguments().getInt("message");
		
		progressDialog = new ProgressDialog(getActivity());
		progressDialog.setTitle(title);
		progressDialog.setMessage(getResources().getText(message));
		progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
		
		return progressDialog;
	}
}

以下使い方

final int interval = 5000;
final SpinningProgressDialog dialogFragment = SpinningProgressDialog
				.newInstance(R.string.app_name, R.string.dialog_message);
dialogFragment.show(getFragmentManager(), "dialog_fragment");

// 5秒後に終了
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
    	dialogFragment.dismiss();
    }
}, interval);

HorizontalProgressダイアログ

プログレスダイアログ、処理中であることを伝えるダイアログ。処理のパーセントも表示する。
device-2014-03-30-220635

以下ダイアログクラスのコード

import android.app.Dialog;
import android.app.DialogFragment;
import android.app.ProgressDialog;
import android.os.Bundle;

public class HorizontalProgressDialog extends DialogFragment {
	private ProgressDialog progressDialog;
	
	public static HorizontalProgressDialog newInstance(int title, int message, int max) {
		HorizontalProgressDialog fragment = new HorizontalProgressDialog();
		Bundle args = new Bundle();
		args.putInt("title", title);
		args.putInt("message", message);
		args.putInt("max", max);
		fragment.setArguments(args);
		
		return fragment;
	}
	
	@Override
	public Dialog onCreateDialog(Bundle safedInstanceState) {
		int title = getArguments().getInt("title");
		int message = getArguments().getInt("message");
		int max = getArguments().getInt("max");
		
		progressDialog = new ProgressDialog(getActivity());
		progressDialog.setTitle(title);
		progressDialog.setMessage(getResources().getText(message));
		progressDialog.setMax(max);
		progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		
		return progressDialog;
	}

	/**
     * プログレス値の取得
     */	
	public int getProgress() {
		return progressDialog.getProgress();
	}
	
	/**
     * プログレス値のセット
     */	
	public void setProgress(int value) {
		progressDialog.setProgress(value);
	}
}

以下使い方

// max 10, interval 1000(1秒)
final int maxProgress = 10;
final int interval = 1000;
final HorizontalProgressDialog dialogFragment = HorizontalProgressDialog
			.newInstance(R.string.app_name, R.string.dialog_message, maxProgress);
dialogFragment.show(getFragmentManager(), "dialog_fragment");

// 1秒づつ+1してmax値(10)になったら終了
Handler handler = new Handler() {
	@Override
	public void handleMessage(Message msg) {
		dialogFragment.setProgress(dialogFragment.getProgress() + 1);
		
		// max超えたら終了
		if (dialogFragment.getProgress() >= maxProgress) {
			dialogFragment.dismiss();
		}
		
		sendEmptyMessageDelayed(0, interval);
	}
};
handler.sendEmptyMessage(0);

今回作成したサンプルプロジェクト

DialogFragmentSample

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です