i have problem , solutions i've found did not work me (check null etc.).
i have simple activity hosts 2 fragments in landscape mode , 1 framelayout in portrait mode. when change orientation of device , change back, click handler not working (getactivity() in detailfragment null).
here code far:
//userlistactivity.java public class userlistactivity extends appcompatactivity implements userlistfragment.onuserlistselectedlistener { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_user_list); // check whether activity using layout version // fragment_container framelayout. if so, must add first fragment if (findviewbyid(r.id.fragment_container) != null) { // however, if we're being restored previous state, // don't need , should return or else // end overlapping fragments. if (savedinstancestate != null) { return; } userlistfragment fragment = new userlistfragment(); fragmentmanager fragmentmanager = getsupportfragmentmanager(); fragmenttransaction fragmenttransaction = fragmentmanager.begintransaction(); fragmenttransaction.add(r.id.fragment_container, fragment, ""); fragmenttransaction.settransition(fragmenttransaction.transit_fragment_open); fragmenttransaction.commit(); } } @override public void onuserlistselected(user selecteduser) { userdetailfragment userdetailfragment = (userdetailfragment) getsupportfragmentmanager().findfragmentbyid(r.id.user_detail_fragment); if (userdetailfragment != null) { // if detail frag available, we're in two-pane layout... userdetailfragment.updateselectedview(selecteduser); } else { // otherwise, we're in one-pane layout , must swap frags... //create detailfragment userdetailfragment newfragment = new userdetailfragment(); bundle args = new bundle(); args.putstring(userdetailfragment.arg_selected_user, new gson().tojson(selecteduser)); newfragment.setarguments(args); //replace fragment fragmentmanager fragmentmanager = getsupportfragmentmanager(); fragmenttransaction fragmenttransaction = fragmentmanager.begintransaction(); fragmenttransaction.replace(r.id.fragment_container, newfragment, ""); fragmenttransaction.settransition(fragmenttransaction.transit_fragment_open); fragmenttransaction.addtobackstack(null); fragmenttransaction.commit(); } } } //userlistfragment.java public class userlistfragment extends listfragment implements adapterview.onitemclicklistener { private onuserlistselectedlistener mcallback; private user[] users; public interface onuserlistselectedlistener { void onuserlistselected(user selecteduser); } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { return inflater.inflate(r.layout.user_list_fragment, container, false); } @override public void onactivitycreated(bundle savedinstancestate) { super.onactivitycreated(savedinstancestate); if (users == null) { getallusers(); } else { setadapter(); } getlistview().setonitemclicklistener(this); } @override public void onattach(activity activity) { super.onattach(activity); // makes sure container activity has implemented // callback interface. if not, throws exception try { mcallback = (onuserlistselectedlistener) activity; } catch (classcastexception e) { throw new classcastexception(activity.tostring() + " must implement onuserlistselectedlistener"); } } @override public void onitemclick(adapterview<?> parent, view view, int position, long id) { mcallback.onuserlistselected(users[position]); } private void setadapter() { setlistadapter(new userlistadapter(getactivity(), r.layout.user_list_row, users)); } private void getallusers() { try { //... //async webcall using volley //... users = tmp.getusers().toarray(new user[tmp.getusers().size()]); setadapter(); //... } } //userdetailfragment.java public class userdetailfragment extends fragment { final public static string arg_selected_user = "selecteduser"; private user mselecteduser; @nullable @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { if (savedinstancestate != null) { mselecteduser = new gson().fromjson(savedinstancestate.getstring(arg_selected_user), user.class); } return inflater.inflate(r.layout.user_detail_fragment, container, false); } @override public void onstart() { super.onstart(); bundle args = getarguments(); if (args != null) { updateselectedview(new gson().fromjson(args.getstring(arg_selected_user), user.class)); } else { updateselectedview(null); } } @override public void onsaveinstancestate(bundle outstate) { super.onsaveinstancestate(outstate); outstate.putstring(arg_selected_user, new gson().tojson(mselecteduser)); } public void updateselectedview(user selecteduser) { //??? why getactivity() after change of orientation null ??? if (getactivity() != null) { textview textusername = (textview) getactivity().findviewbyid(r.id.textusername); textview textuseremail = (textview) getactivity().findviewbyid(r.id.textuseremail); if (selecteduser != null) { textusername.settext(selecteduser.getname()); textuseremail.settext(selecteduser.getemail()); mselecteduser = selecteduser; } else { textusername.settext(null); } } } }
userdetailfragment userdetailfragment = (userdetailfragment) getsupportfragmentmanager().findfragmentbyid(r.id.user_detail_fragment); creates new instance of fragment.
if (findviewbyid(r.id.fragment_container) != null) { // however, if we're being restored previous state, // don't need , should return or else // end overlapping fragments. if (savedinstancestate != null) { return; } userlistfragment fragment = new userlistfragment(); fragmentmanager fragmentmanager = getsupportfragmentmanager(); fragmenttransaction fragmenttransaction = fragmentmanager.begintransaction(); fragmenttransaction.add(r.id.fragment_container, fragment, ""); fragmenttransaction.settransition(fragmenttransaction.transit_fragment_open); fragmenttransaction.commit(); } is reusing old instance of fragment .
therefore, use getfragmentbytag() , dont keep tag empty string (""), while calling .add
Comments
Post a Comment