java - ClassCastException when resuming activity in android -
i trying use code
public class tabactivity extends sherlockfragmentactivity implements actionbar.tablistener, onitemselectedlistener { enum tabtype { search, list, favorites } // tab stacks private hashmap<tabtype, stack<string>> backstacks; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // initialize actionbar actionbar bar = getsupportactionbar(); bar.setnavigationmode(actionbar.navigation_mode_tabs); // set stacks if (savedinstancestate != null) { // read stacks after orientation change backstacks = (hashmap<tabtype, stack<string>>) savedinstancestate.getserializable("stacks"); } else { // initialize stacks on first run backstacks = new hashmap<tabtype, stack<string>>(); backstacks.put(tabtype.search, new stack<string>()); backstacks.put(tabtype.list, new stack<string>()); backstacks.put(tabtype.favorites, new stack<string>()); } // create tabs bar.addtab(bar.newtab().settag(tabtype.search).settext("search").settablistener(this)); bar.addtab(bar.newtab().settag(tabtype.list).settext("list").settablistener(this)); bar.addtab(bar.newtab().settag(tabtype.favorites).settext("favorites").settablistener(this)); } @override protected void onresume() { super.onresume(); // select proper stack tab tab = getsupportactionbar().getselectedtab(); stack<string> backstack = backstacks.get(tab.gettag()); if (! backstack.isempty()) { // restore topmost fragment (e.g. after application switch) string tag = backstack.peek(); fragment fragment = getsupportfragmentmanager().findfragmentbytag(tag); if (fragment.isdetached()) { fragmenttransaction ft = getsupportfragmentmanager().begintransaction(); ft.attach(fragment); ft.commit(); } } } @override protected void onpause() { super.onpause(); // select proper stack tab tab = getsupportactionbar().getselectedtab(); stack<string> backstack = backstacks.get(tab.gettag()); if (! backstack.isempty()) { // detach topmost fragment otherwise not correctly displayed // after orientation change string tag = backstack.peek(); fragmenttransaction ft = getsupportfragmentmanager().begintransaction(); fragment fragment = getsupportfragmentmanager().findfragmentbytag(tag); ft.detach(fragment); ft.commit(); } } @override protected void onrestoreinstancestate(bundle savedinstancestate) { super.onrestoreinstancestate(savedinstancestate); // restore selected tab int saved = savedinstancestate.getint("tab", 0); if (saved != getsupportactionbar().getselectednavigationindex()) getsupportactionbar().setselectednavigationitem(saved); } @override protected void onsaveinstancestate(bundle outstate) { super.onsaveinstancestate(outstate); // save selected tab , stacks outstate.putint("tab", getsupportactionbar().getselectednavigationindex()); outstate.putserializable("stacks", backstacks); } @override public void onbackpressed() { // select proper stack tab tab = getsupportactionbar().getselectedtab(); stack<string> backstack = backstacks.get(tab.gettag()); string tag = backstack.pop(); if (backstack.isempty()) { // let application finish super.onbackpressed(); } else { fragmenttransaction ft = getsupportfragmentmanager().begintransaction(); fragment fragment = getsupportfragmentmanager().findfragmentbytag(tag); // animate return previous fragment ft.setcustomanimations(r.anim.slide_from_right, r.anim.slide_to_left); // remove topmost fragment stack , forget ft.remove(fragment); showfragment(backstack, ft); ft.commit(); } } @override public void ontabselected(tab tab, fragmenttransaction ft) { // select proper stack stack<string> backstack = backstacks.get(tab.gettag()); if (backstack.isempty()) { // if empty instantiate , add initial tab fragment fragment fragment; switch ((tabtype) tab.gettag()) { case search: fragment = fragment.instantiate(this, searchfragment.class.getname()); break; case list: fragment = fragment.instantiate(this, listfragment.class.getname()); break; case favorites: fragment = fragment.instantiate(this, favoritesfragment.class.getname()); break; default: throw new java.lang.illegalargumentexception("unknown tab"); } addfragment(fragment, backstack, ft); } else { // show topmost fragment showfragment(backstack, ft); } } @override public void ontabunselected(tab tab, fragmenttransaction ft) { // select proper stack stack<string> backstack = backstacks.get(tab.gettag()); // topmost fragment string tag = backstack.peek(); fragment fragment = getsupportfragmentmanager().findfragmentbytag(tag); // detach ft.detach(fragment); } @override public void ontabreselected(tab tab, fragmenttransaction ft) { // select proper stack stack<string> backstack = backstacks.get(tab.gettag()); if (backstack.size() > 1) ft.setcustomanimations(r.anim.slide_from_right, r.anim.slide_to_left); // clean stack leaving initial fragment while (backstack.size() > 1) { // pop topmost fragment string tag = backstack.pop(); fragment fragment = getsupportfragmentmanager().findfragmentbytag(tag); // remove ft.remove(fragment); } showfragment(backstack, ft); } private void addfragment(fragment fragment) { // select proper stack tab tab = getsupportactionbar().getselectedtab(); stack<string> backstack = backstacks.get(tab.gettag()); fragmenttransaction ft = getsupportfragmentmanager().begintransaction(); // animate transfer new fragment ft.setcustomanimations(r.anim.slide_from_left, r.anim.slide_to_right); // topmost fragment string tag = backstack.peek(); fragment top = getsupportfragmentmanager().findfragmentbytag(tag); ft.detach(top); // add new fragment addfragment(fragment, backstack, ft); ft.commit(); } private void addfragment(fragment fragment, stack<string> backstack, fragmenttransaction ft) { // add fragment stack unique tag string tag = uuid.randomuuid().tostring(); ft.add(android.r.id.content, fragment, tag); backstack.push(tag); } private void showfragment(stack<string> backstack, fragmenttransaction ft) { // peek topmost fragment stack string tag = backstack.peek(); fragment fragment = getsupportfragmentmanager().findfragmentbytag(tag); // , attach ft.attach(fragment); } // following code shows how open new fragment. assumes // parent fragment calls activity via interface. approach // described in android development guidelines. @override public void onitemselected(string item) { itemfragment fragment = new itemfragment(); bundle args = new bundle(); args.putstring("item", item); fragment.setarguments(args); addfragment(fragment); } }
in app, doing navigation tabs. know, there used lot of deprecated methods, want start this. working great except when app getting background , need resumed (after longer time, think cleared rams). getting
java.lang.classcastexception: java.util.arraylist cannot cast java.util.stack
when calling (73 line in code)
stack backstack = backstacks.get(tab.gettag());
what wrong? why works when activity starting first time, onresume gives anr?
this happening i'd because backstacks.get(tab.gettag()); returns list not stack. try instead:
list backstack = backstacks.get(tab.gettag()); you shouldn't using raw types.
Comments
Post a Comment