java - getActivity in Fragment is null after change of orientation (single and one pane layout) -


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