android - Fragment's onCreate and onCreateView are not called -
i'm building application receive action.send intent
, display files in clip data listview
. listview
inside sharefragment
hosted mainactiviy
. below how implement it.
public class sharefragment extends mfragment { private static final string tag = "sharefragment"; private list<file> files; private fileadapter fileadapter; @override public void oncreate(@nullable bundle savedinstancestate) { super.oncreate(savedinstancestate); log.e(tag, "oncreate called"); } @nullable @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { files = new arraylist<>(); fileadapter = new fileadapter(getactivity(), 0, files); view rootview = inflater.inflate(r.layout.share_fragment, container, false); listview lv = (listview) rootview.findviewbyid(r.id.listview); lv.setadapter(fileadapter); log.e(tag, "oncreateview called"); return rootview; } public void setdata(list<file> files){ log.e(tag, "setdata called"); this.files = files; fileadapter.notifydatasetchanged(); }
and here how used in mainactivity
@override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); intent intent = getintent(); sharefragment = (sharefragment) getsupportfragmentmanager().findfragmentbytag("share_fragment"); if(sharefragment == null) { sharefragment = new sharefragment(); sharefragment.settitle("share"); } fragmenttransaction ft = getsupportfragmentmanager().begintransaction(); ft.add(r.id.fl_root, sharefragment, "share_fragment"); ft.commit(); handleintent(intent); }
here handleintent
method:
private void handleintent(intent intent) { string action = intent.getaction(); string type = intent.gettype(); if ((intent.action_send.equals(action) || intent.action_send_multiple.equals(action)) && type != null) { int size = intent.getclipdata().getitemcount(); list<file> files = new arraylist<>(); (int = 0; < size; i++) { file file = new file(intent.getclipdata().getitemat(i).geturi().getpath()); files.add(file); } sharefragment.setdata(files); } }
my problem is when application started receive action.send
intent
, ran oncreate
, processed line sharefragment = new sharefragment()
but oncreate
, oncreateview
of sharefragment
never called. why?
note thought fragmentmanager
kept instance of sharefragment
when app first ran. try found fragment reused it, returned null.
edit got nullpointerexception
right @ fileadapter.notifydatasetchanged();
caused by: java.lang.nullpointerexception: attempt invoke virtual method 'void icetea.com.quickshare.adapter.fileadapter.notifydatasetchanged()' on null object reference @ icetea.com.quickshare.fragments.sharefragment.setdata(sharefragment.java:49) @ icetea.com.quickshare.mainactivity.handleintent(mainactivity.java:63) @ icetea.com.quickshare.mainactivity.oncreate(mainactivity.java:46) @ android.app.activity.performcreate(activity.java:6374) @ android.app.instrumentation.callactivityoncreate(instrumentation.java:1119) @ android.app.activitythread.performlaunchactivity(activitythread.java:2767) at android.app.activitythread.handlelaunchactivity(activitythread.java:2879) at android.app.activitythread.access$900(activitythread.java:182) at android.app.activitythread$h.handlemessage(activitythread.java:1475) at android.os.handler.dispatchmessage(handler.java:102) at android.os.looper.loop(looper.java:145) at android.app.activitythread.main(activitythread.java:6141) at java.lang.reflect.method.invoke(native method) at java.lang.reflect.method.invoke(method.java:372) at com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1399) at com.android.internal.os.zygoteinit.main(zygoteinit.java:1194)
move handleintent(intent);
onresume()
you try set data in oncreate, @ time fragment isn't created
you find more in fragments documentation: http://developer.android.com/guide/components/fragments.html#lifecycle
Comments
Post a Comment