このDialogFragmentの実装により、
IllegalStateException( "ダイアログのOnCancelListenerまたはOnDismissListenerを設定できません")
。どうして?解決?
_public class OkCThreadDialog1 extends DialogFragment{
DialogInterface.OnCancelListener onCancelListener;
public OkCThreadDialog1(){
}
public static OkCThreadDialog1 newInstance(String title, String message) {
OkCThreadDialog1 frag = new OkCThreadDialog1();
Bundle args = new Bundle();
args.putString("title", title);
args.putString("message", message);
frag.setArguments(args);
return frag;
}
public Dialog onCreateDialog(Bundle savedInstanceState){
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder .setTitle(getArguments().getString("title"))
.setMessage(getArguments().getString("message"))
.setOnCancelListener(onCancelListener)
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
getDialog().cancel();
}});
return builder.create();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// Verify that the Host activity implements the callback interface
try {
onCancelListener = (DialogInterface.OnCancelListener) activity;
} catch (ClassCastException e) {
// The activity doesn't implement the interface, throw exception
throw new ClassCastException(activity.toString()
+ " must implement OkCancelDialogListener");
}
}
}
_
私のアクティビティは、次のように_DialogInterface.OnCancelListener
_を実装します。
_public class MainActivity extends Activity implements OkCancelDialogListener{
static final String TAG ="MainActivity";
@Override
public void onCancel(DialogInterface dialog) {
}
}
_
例外はbuilder.create();
からスローされます。どうしましたか?
から Androidドキュメント :
public Dialog onCreateDialog(Bundle savedInstanceState)
オーバーライドして、独自のカスタムダイアログコンテナを作成します。これは通常、一般的なダイアログの代わりにAlertDialogを表示するために使用されます。その場合、AlertDialogが独自のコンテンツを処理するため、onCreateView(LayoutInflater、ViewGroup、Bundle)を実装する必要はありません。
このメソッドは、onCreate(Bundle)の後、onCreateView(LayoutInflater、ViewGroup、Bundle)の前に呼び出されます。デフォルトの実装では、Dialogクラスをインスタンス化して返します。
注:DialogFragmentは、Dialog.setOnCancelListenerおよびDialog.setOnDismissListenerコールバックを所有します。自分で設定してはいけません。
これらのイベントについて調べるには、onCancel(DialogInterface)およびonDismiss(DialogInterface)をオーバーライドします。
したがって、基本的には、「。setOnCancelListener(onCancelListener)」の代わりにonDismissまたはOnCancelをオーバーライドする必要があります。
あなたはこれを試すことができます:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Title");
builder.setMessage("Message");
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// do something positive
}
});
return builder.create();
}
@Override
public void onCancel(DialogInterface dialog) {
// do something
}
それが役立つことを願っています...
ビルダーではなくダイアログにOnCancelListenerを設定します。
public Dialog onCreateDialog(Bundle savedInstanceState){
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder .setTitle(getArguments().getString("title"))
.setMessage(getArguments().getString("message"))
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
getDialog().cancel();
}});
Dialog dialog = builder.create();
dialog.setOnCancelListener(onCancelListener);
return dialog;
}