android - How to implement DialogFragment -
i wondering how implement dialogfragment class:
public class mydialogfragment extends dialogfragment { private static final string arg_listener_type = "listenertype"; private dialoglistener mlistener; static enum listenertype { activity, fragment } public interface dialoglistener { public void ondialogpositiveclick(dialogfragment dialog); public void ondialognegativeclick(dialogfragment dialog); } public static mydialogfragment newinstance(dialoglistener listener) { final mydialogfragment instance; if (listener instanceof activity) { instance = createinstance(listenertype.activity); } else if (listener instanceof fragment) { instance = createinstance(listenertype.fragment); instance.settargetfragment((fragment) listener, 0); } else { throw new illegalargumentexception(listener.getclass() + " must either activity or fragment"); } homecoming instance; } private static mydialogfragment createinstance(listenertype type) { mydialogfragment fragment = new mydialogfragment(); bundle args = new bundle(); args.putserializable(arg_listener_type, type); fragment.setarguments(args); homecoming fragment; } @override public dialog oncreatedialog(bundle savedinstancestate) { // todo: create dialog here alertdialog.builder builder = new alertdialog.builder(getactivity()); builder.setmessage(r.string.app_name); builder.setpositivebutton(android.r.string.ok, new onclicklistener() { public void onclick(dialoginterface dialog, int which) { mlistener.ondialogpositiveclick(mydialogfragment.this); } }); builder.setnegativebutton(android.r.string.cancel, new onclicklistener() { public void onclick(dialoginterface dialog, int which) { mlistener.ondialognegativeclick(mydialogfragment.this); } }); homecoming builder.create(); } @override public void onattach(activity activity) { super.onattach(activity); // find out how dialoglistener instance send callback // events bundle args = getarguments(); listenertype listenertype = (listenertype) args.getserializable(arg_listener_type); switch (listenertype) { case activity: { // send callback events hosting activity mlistener = (dialoglistener) activity; break; } case fragment: { // send callback events "target" fragment mlistener = (dialoglistener) gettargetfragment(); break; } } } @override public void ondetach() { mlistener = null; } } i have implemented dialoglistener class in fragment this:
public class myfragment extends fragment implements dialoglistener @override public void ondialogpositiveclick(dialogfragment dialog) { // todo auto-generated method stub } @override public void ondialognegativeclick(dialogfragment dialog) { // todo auto-generated method stub } and:
mydialogfragment dialogfragment = mydialogfragment.newinstance(myfragment.this); dialogfragment.show(getfragmentmanager(), gettag()); and dialog box appears, when click on or cancel throws illegalargumentexception
here's log:
02-20 22:02:57.022: e/androidruntime(1997): fatal exception: main 02-20 22:02:57.022: e/androidruntime(1997): android.app.supernotcalledexception: fragment mydialogfragment{b57064f0 #1} did not phone call through super.ondetach() 02-20 22:02:57.022: e/androidruntime(1997): @ android.app.fragmentmanagerimpl.movetostate(fragmentmanager.java:992) 02-20 22:02:57.022: e/androidruntime(1997): @ android.app.fragmentmanagerimpl.removefragment(fragmentmanager.java:1123) 02-20 22:02:57.022: e/androidruntime(1997): @ android.app.backstackrecord.run(backstackrecord.java:592) 02-20 22:02:57.022: e/androidruntime(1997): @ android.app.fragmentmanagerimpl.execpendingactions(fragmentmanager.java:1382) 02-20 22:02:57.022: e/androidruntime(1997): @ android.app.fragmentmanagerimpl$1.run(fragmentmanager.java:426) 02-20 22:02:57.022: e/androidruntime(1997): @ android.os.handler.handlecallback(handler.java:605) 02-20 22:02:57.022: e/androidruntime(1997): @ android.os.handler.dispatchmessage(handler.java:92) 02-20 22:02:57.022: e/androidruntime(1997): @ android.os.looper.loop(looper.java:137) 02-20 22:02:57.022: e/androidruntime(1997): @ android.app.activitythread.main(activitythread.java:4424) 02-20 22:02:57.022: e/androidruntime(1997): @ java.lang.reflect.method.invokenative(native method) 02-20 22:02:57.022: e/androidruntime(1997): @ java.lang.reflect.method.invoke(method.java:511) 02-20 22:02:57.022: e/androidruntime(1997): @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:784) 02-20 22:02:57.022: e/androidruntime(1997): @ com.android.internal.os.zygoteinit.main(zygoteinit.java:551) 02-20 22:02:57.022: e/androidruntime(1997): @ dalvik.system.nativestart.main(native method)
are sure you're getting illegalargumentexception?
base on stacktrace
02-20 22:02:57.022: e/androidruntime(1997): fatal exception: main 02-20 22:02:57.022: e/androidruntime(1997): android.app.supernotcalledexception: fragment mydialogfragment{b57064f0 #1} did not phone call through super.ondetach() 02-20 22:02:57.022: e/androidruntime(1997): @ android.app.fragmentmanagerimpl.movetostate(fragmentmanager.java:992) 02-20 22:02:57.022: e/androidruntime(1997): @ android.app.fragmentmanagerimpl.removefragment(fragmentmanager.java:1123) 02-20 22:02:57.022: e/androidruntime(1997): @ android.app.backstackrecord.run(backstackrecord.java:592) it of import phone call super.ondetach() you're stopping lifecycle of fragment , activity might affected (in theory).
@override public void ondetach() { mlistener = null; super.ondetach() } android
No comments:
Post a Comment