android - Added Fragment is not removed and causing App crash -
adding fragment works ok, removing crashes app. thought removing straight forwards im still beginner must missing something. can take look?
public class mainactivity extends activity implements onclicklistener { button addfragment, closefragment; android.app.fragmentmanager fragmentmanager = getfragmentmanager(); android.app.fragmenttransaction transaction = fragmentmanager .begintransaction(); @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); initialize(); } private void initialize() { addfragment = (button) findviewbyid(r.id.baddf); closefragment = (button) findviewbyid(r.id.bclosef); addfragment .setonclicklistener((android.view.view.onclicklistener) this); closefragment .setonclicklistener((android.view.view.onclicklistener) this); } @override public void onclick(view arg0) { // todo auto-generated method stub //instantiate fragment examplefragment class examplefragment fragment = new examplefragment(); switch(arg0.getid()){ case r.id.baddf: transaction.add(r.id.fragment_holder, fragment).commit(); break; case r.id.bclosef: transaction.remove(fragment).commit(); break; } } }
your app crashes because saving fragmenttransaction fellow member variable. fragmenttransactions cannot reused. furthermore, creating new fragment everytime, means added fragment not removed when clicking remove button.
do way:
private examplefragment mfragment; @override public void onclick(view v) { //instantiate fragment examplefragment class if(mfragment == null) mfragment = new examplefragment(); switch(v.getid()){ case r.id.baddf: getfragmentmanager().begintransaction().add(r.id.fragment_holder, mfragment, "tag").commit(); break; case r.id.bclosef: getfragmentmanager().begintransaction().remove(mfragment).commit(); break; } } create new fragmenttransaction each add() or remove() procedure.
as alternative keeping examplefragment fellow member variable, can utilize fragmentmanager.findfragmentbytag("tag") added fragment.
alternative way:
@override public void onclick(view v) { switch(v.getid()){ case r.id.baddf: getfragmentmanager().begintransaction().add(r.id.fragment_holder, new examplefragment(), "tag").commit(); break; case r.id.bclosef: fragment frag = getfragmentmanager().findfragmentbytag("tag"); getfragmentmanager().begintransaction().remove(frag).commit(); break; } } android android-fragments
No comments:
Post a Comment