IllegalStateException ( "Вы не можете установить Dialog OnCancelListener или OnDismissListener" )
Эта реализация DialogFragment вызывает
IllegalStateException ( "Вы не можете установить Dialog 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();
. Что не так?
Ответы
Ответ 1
Из документации для Android:
public Dialog onCreateDialog (Bundle savedInstanceState)
Переопределить, чтобы создать собственный пользовательский контейнер диалога. Это обычно используется для отображения AlertDialog вместо общего диалога; при этом onCreateView (LayoutInflater, ViewGroup, Bundle) делает не нужно реализовывать, поскольку AlertDialog заботится о своих собственных содержание.
Этот метод будет вызываться после onCreate (Bundle) и до onCreateView (LayoutInflater, ViewGroup, Bundle). По умолчанию реализация просто создает экземпляр и возвращает класс Dialog.
Примечание. DialogFragment имеет собственные обратные вызовы Dialog.setOnCancelListener и Dialog.setOnDismissListener. Вы не должны устанавливать их самостоятельно.
Чтобы узнать об этих событиях, переопределите onCancel (DialogInterface) и onDismiss (DialogInterface).
В принципе, вы должны переопределить onDismiss или OnCancel вместо '.setOnCancelListener(onCancelListener)'.
Ответ 2
Вы можете попробовать следующее:
@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
}
Надеюсь, что это поможет...
Ответ 3
Вы устанавливаете 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;
}
Ответ 4
Попробуйте этот код, я надеюсь, что это будет работа.
AlertDialog.Builder builder = new AlertDialog.Builder(
class_name.this);
builder.setTitle("Title");
AlertDialog dialog = builder.create();
dialog.setButton("ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
});
dialog.setButton2("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
dialog.show();