android - getActivity().getActionBar() on first fragment crash -
public class mainactivity extends actionbaractivity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); setupviewpager(); } private void setupviewpager() { // todo auto-generated method stub fragmentpageritemadapter adapter = new fragmentpageritemadapter( getsupportfragmentmanager(), fragmentpageritems.with(this) .add("home", homefragment.class) .add("message", messagefragment.class) .add("my", myfragment.class).create()); viewpager viewpager = (viewpager) findviewbyid(r.id.viewpager); viewpager.setadapter(adapter); smarttablayout viewpagertab = (smarttablayout) findviewbyid(r.id.viewpagertab); final layoutinflater inflater = layoutinflater.from(viewpagertab.getcontext()); final resources res = viewpagertab.getcontext().getresources(); viewpagertab.setcustomtabview(new smarttablayout.tabprovider() { @override public view createtabview(viewgroup container, int position,pageradapter adapter) { imageview icon = (imageview) inflater.inflate(r.layout.mainactivity_tab, container, false); switch (position) { case 0: icon.setimagedrawable(res.getdrawable(r.drawable.mainactivity_tab_icon_home)); break; case 1: icon.setimagedrawable(res.getdrawable(r.drawable.mainactivity_tab_icon_message)); break; case 2: icon.setimagedrawable(res.getdrawable(r.drawable.mainactivity_tab_icon_my)); break; default: throw new illegalstateexception("invalid position: "+ position); } return icon; } }); viewpagertab.setviewpager(viewpager); }
here code in 3 fragment
public class homefragment extends fragment { view rootview; @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { rootview = inflater.inflate(r.layout.fragment_home, container, false); textview title = (textview) rootview.findviewbyid(r.id.item_title); title.settext("home"); return rootview; } @override public void setmenuvisibility(final boolean visible) { super.setmenuvisibility(visible); if (visible) { log.d("action bar", "home"); actionbar mactionbar= getactivity().getactionbar(); mactionbar.setdisplayshowhomeenabled(true); mactionbar.setdisplayshowtitleenabled(false); layoutinflater minflater = layoutinflater.from(getactivity()); view mcustomview = minflater.inflate(r.layout.actionbar_message, null); mactionbar.setcustomview(mcustomview); mactionbar.setdisplayshowcustomenabled(true); textview title = (textview) mcustomview.findviewbyid(r.id.actionbar_message_title); title.settext("home action bar"); } }
they work on messagefragment.class , myfragment not homefragment. crash , actionbar mactionbar = getactivity().getactionbar();
return null
, crash.
why works on messagefragment , myfragment?
homefragment first fragment show.
my idea: use different custom action bar on different fragment.
the problem fragment not attached activity when setmenuvisibility
called. therefore getactivity
returns null
.
i don't understand why you'd want mess method in first place. can modify the action bar in oncreateview
:
@override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { rootview = inflater.inflate(r.layout.fragment_home, container, false); { textview title = (textview) rootview.findviewbyid(r.id.item_title); title.settext("home"); } actionbar mactionbar= getactivity().getactionbar(); mactionbar.setdisplayshowhomeenabled(true); mactionbar.setdisplayshowtitleenabled(false); layoutinflater minflater = layoutinflater.from(getactivity()); view mcustomview = minflater.inflate(r.layout.actionbar_message, null); mactionbar.setcustomview(mcustomview); mactionbar.setdisplayshowcustomenabled(true); textview title = (textview) mcustomview.findviewbyid(r.id.actionbar_message_title); title.settext("message action bar"); return rootview; }
if need use of method, try simple null check:
if (visible && getactivity() != null) {
Comments
Post a Comment