Monday, 15 April 2013

android - Added Fragment is not removed and causing App crash -



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