android - IllegalStateException in Fragment Activity -
i have fragmentactivity class represents customer information; inside class, have 2 inner classes fragment , fragment adapter. below code:
public class customerinfofragmentactivity extends fragmentactivity implements onclicklistener, onitemselectedlistener, oncheckedchangelistener, onseekbarchangelistener, onpagechangelistener { public static final string form_name = "customer information"; private static final string tag = "customerinfofragmentactivity"; private static final int time_dialog_id = 0; private static final int date_dialog_id = 1; // no. of pages loaded in pager; make sure accurate private static int page_count = 4; private serverservice serverservice; // form entry date calendar formdate; // layout view containing navigation bar , buttons linearlayout navigatorlayout; button firstbutton; button lastbutton; button formdatebutton; button savebutton; button clearbutton; seekbar navigationseekbar; // view pager holds pages generated dynamically viewpager pager; // views displayed in pages, sorted w.r.t. appearance on pager textview phone1textview; edittext phone1; textview phone1ownertextview; checkbox phone1owner; edittext phone1ownername; textview phone2textview; edittext phone2; textview phone2ownertextview; checkbox phone2owner; edittext phone2ownername; textview address; edittext address1; edittext address2; edittext landmark; edittext town; edittext patientid; button scanbarcode; // arraylist hold linear layouts - 1 each page arraylist<viewgroup> groups; view[] views; class customerinfofragment extends fragment { int currentpage; @override public void oncreate (bundle savedinstancestate) { super.oncreate (savedinstancestate); bundle data = getarguments (); currentpage = data.getint ("current_page", 0); } @override public view oncreateview (layoutinflater inflater, viewgroup container, bundle savedinstancestate) { // return layout of views pre-filled arraylist of groups if (currentpage != 0 && groups.size () != 0) return groups.get (currentpage - 1); else return null; } } class customerinfofragmentpageradapter extends fragmentpageradapter { /** constructor of class */ public customerinfofragmentpageradapter (fragmentmanager fragmentmanager) { super (fragmentmanager); } /** method invoked when page requested create */ @override public fragment getitem (int arg0) { customerinfofragment fragment = new customerinfofragment (); bundle data = new bundle (); data.putint ("current_page", arg0 + 1); fragment.setarguments (data); return fragment; } /** returns number of pages */ @override public int getcount () { return page_count; } } @override protected void oncreate (bundle savedinstancestate) { super.oncreate (savedinstancestate); setcontentview (r.layout.template); serverservice = new serverservice (getapplicationcontext ()); formdate = calendar.getinstance (); createviews (this); initview (views); updatedisplay (); } public void createviews (context context) { // create fixed views formdatebutton = (button) findviewbyid (r.template_id.formdate); firstbutton = (button) findviewbyid (r.template_id.firstbutton); lastbutton = (button) findviewbyid (r.template_id.lastbutton); clearbutton = (button) findviewbyid (r.template_id.clearbutton); savebutton = (button) findviewbyid (r.template_id.savebutton); navigationseekbar = (seekbar) findviewbyid (r.template_id.navigationseekbar); pager = (viewpager) findviewbyid (r.template_id.pager); navigationseekbar.setmax (page_count - 1); navigatorlayout = (linearlayout) findviewbyid (r.template_id.navigatorlayout); // if form consists of single page, hide // navigatorlayout if (page_count < 2) { navigatorlayout.setvisibility (linearlayout.gone); } fragmentmanager fragmentmanager = getsupportfragmentmanager (); customerinfofragmentpageradapter pageradapter = new customerinfofragmentpageradapter (fragmentmanager); pager.setadapter (pageradapter); // create views pages phone1textview = new textview (context); phone1 = new edittext (context); phone1ownertextview = new textview (context); phone1owner = new checkbox (context); phone1ownername = new edittext (context); phone2textview = new textview (context); phone2 = new edittext (context); phone2ownertextview = new textview (context); phone2owner = new checkbox (context); phone2ownername = new edittext (context); address = new textview (context); address1 = new edittext (context); address2 = new edittext (context); landmark = new edittext (context); town = new edittext (context); patientid = new edittext (context); scanbarcode = new button (context); phone1textview.settext (r.string.primary_phone); phone1textview.settextappearance (context, r.style.text); phone1.settag (r.string.primary_phone); phone1.sethint (r.string.primary_phone_hint); phone1.setinputtype (inputtype.type_class_phone); phone1.settextappearance (context, r.style.text); phone1owner.settext (r.string.self_owned); phone1owner.setchecked (true); phone1ownername.settag (r.string.owner_name); phone1ownername.sethint (r.string.owner_name_hint); phone1ownername.setvisibility (edittext.gone); phone2textview.settext (r.string.secondary_phone); phone2textview.settextappearance (context, r.style.text); phone2.settag (r.string.secondary_phone); phone2.sethint (r.string.secondary_phone_hint); phone2.setinputtype (inputtype.type_class_phone); phone2.settextappearance (context, r.style.text); phone2owner.settext (r.string.self_owned); phone2owner.setchecked (true); phone2ownername.settag (r.string.secondary_phone); phone2ownername.sethint (r.string.owner_name_hint); phone2ownername.setvisibility (edittext.gone); address.settext (r.string.address); address.settextappearance (context, r.style.text); address1.settag (r.string.address1); address1.settextappearance (context, r.style.text); address1.sethint (r.string.address1_hint); address2.settag (r.string.address2); address2.settextappearance (context, r.style.text); address2.sethint (r.string.address2_hint); landmark.settag (r.string.landmark); landmark.settextappearance (context, r.style.text); landmark.sethint (r.string.landmark_hint); town.settag (r.string.town); town.settextappearance (context, r.style.text); town.sethint (r.string.town_hint); town.settext (app.getcity ()); patientid.settag (r.string.patient_id); patientid.sethint (r.string.patient_id_hint); patientid.settextappearance (context, r.style.text); patientid.setinputtype (inputtype.type_class_number); scanbarcode.settext (r.string.scan_barcode); scanbarcode.settextappearance (context, r.style.text); scanbarcode.setcompounddrawables (getresources ().getdrawable (r.drawable.barcode), null, null, null); // create layouts , store in arraylist groups = new arraylist<viewgroup> (); linearlayout layout = new linearlayout (context); layout.setorientation (linearlayout.vertical); layout.addview (phone1textview); layout.addview (phone1); layout.addview (phone1owner); layout.addview (phone1ownername); groups.add (layout); linearlayout layout2 = new linearlayout (context); layout2.setorientation (linearlayout.vertical); layout2.addview (phone2textview); layout2.addview (phone2); layout2.addview (phone2owner); layout2.addview (phone2ownername); groups.add (layout2); linearlayout layout3 = new linearlayout (context); layout3.setorientation (linearlayout.vertical); layout3.addview (address); layout3.addview (address1); layout3.addview (address2); layout3.addview (landmark); layout3.addview (town); groups.add (layout3); linearlayout layout4 = new linearlayout (context); layout4.setorientation (linearlayout.vertical); layout4.addview (patientid); layout4.addview (scanbarcode); groups.add (layout4); // set event listeners formdatebutton.setonclicklistener (this); firstbutton.setonclicklistener (this); lastbutton.setonclicklistener (this); clearbutton.setonclicklistener (this); savebutton.setonclicklistener (this); scanbarcode.setonclicklistener (this); navigationseekbar.setonseekbarchangelistener (this); views = new view[] {phone1owner, phone2owner}; (view v : views) { if (v instanceof spinner) { ((spinner) v).setonitemselectedlistener (this); } else if (v instanceof checkbox) { ((checkbox) v).setoncheckedchangelistener (this); } } pager.setonpagechangelistener (this); } public void initview (view[] views) { (view v : views) { if (v instanceof spinner) { ((spinner) v).setselection (0); } else if (v instanceof edittext) { ((edittext) v).settext (""); } } gotopage (0); } public void updatedisplay () { formdatebutton.settext (dateformat.format ("dd-mmm-yyyy", formdate)); } public void gotofirstpage () { gotopage (0); } public void gotolastpage () { gotopage (page_count - 1); } private void gotopage (int pageno) { pager.setcurrentitem (pageno); navigationseekbar.setprogress (pageno); } @override public void onprogresschanged (seekbar seekbar, int progress, boolean isbyuser) { // move page @ index of progress if (isbyuser) pager.setcurrentitem (progress); } @override public void onpageselected (int pageno) { gotopage (pageno); } } the problem appears when swipe pages, when going first page last, have no problems, 1 step throws me illegalstateexception, suggesting child has parent. here exception:
05-03 14:21:36.713: e/androidruntime(944): fatal exception: main 05-03 14:21:36.713: e/androidruntime(944): java.lang.illegalstateexception: specified child has parent. must call removeview() on child's parent first. 05-03 14:21:36.713: e/androidruntime(944): @ android.view.viewgroup.addviewinner(viewgroup.java:1976) 05-03 14:21:36.713: e/androidruntime(944): @ android.view.viewgroup.addview(viewgroup.java:1871) 05-03 14:21:36.713: e/androidruntime(944): @ android.view.viewgroup.addview(viewgroup.java:1828) 05-03 14:21:36.713: e/androidruntime(944): @ android.view.viewgroup.addview(viewgroup.java:1808) 05-03 14:21:36.713: e/androidruntime(944): @ android.support.v4.app.nosavestateframelayout.wrap(nosavestateframelayout.java:40) on debugging, found out oncreateview(...) method customerfragment being called twice @ first , not @ all, when swipe last page. i'm not quite mature in android development, pardon me if i'm doing stupid...
my problem got solved after having deep @ how fragments , viewpages work. added following line in code , problem resolved:
pager.setoffscreenpagelimit(page_count);
Comments
Post a Comment