Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Determine if action bar is split

I have a MapView with an action bar powered by ActionBarSherlock. The action bar is both split (on "narrow" screens) and overlayed / semi-transparent (android:windowActionBarOverlay is true). More or less like the Google Maps app.

Now I would like to push views on top of the map, at the bottom of the screen still keeping it above the bottom action bar. My problem here is that I don't know the height of the bottom action bar. Frankly, I can't even find a way to know if it's drawn or not. getHeight() seems to return the height of the top action bar (or perhaps it's the height of both of them but I still don't know if the bottom action bar exists or not.

Please, tell me this information is right in front of my eyes!

like image 788
pakerfeldt Avatar asked Apr 11 '12 12:04

pakerfeldt


2 Answers

If you are using ActionBarSherlock you can look for the boolean value abs__split_action_bar_is_narrow

Just create some static method where you can do

return ResourcesCompat.getResources_getBoolean(context,
                            R.bool.abs__split_action_bar_is_narrow);

you need to use the ResourcesCompat (from actionbarsherlock) class because pre 3.2 cant read folders with metrics (like values-sw480)

like image 184
BeNeXuS Avatar answered Nov 15 '22 20:11

BeNeXuS


I ran into the same problem. On phone devices in portrait mode the actionbar is split. So menu-items are in the top actionbar and the tabs in a second actionbar (tabbar) below. I just did not find any possible way to determine the height of the actionbar: to see what space is left on the screen before building my screen.

So I did an assumption:

  • on small and normal screensize devices the actionbar is split in portrait mode
  • on large screensize devices (like Nexus 7) the actionbar is also split in portrait mode
  • on xlarge screensize devices (tablets) the actionbar is not split in portrait mode

So I distinguish the different screensizes and created a bool resource

<!-- res/values/booleans.xml -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_split_actionbar">false</bool>
</resources>

<!-- res/values-small-port/booleans.xml
     res/values-normal-port/booleans.xml
     res/values-large-port/booleans.xml -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_split_actionbar">true</bool>
</resources>

In the code I access the value like this:

Boolean isSplit = getResources().getBoolean(R.bool.is_split_actionbar);

To get the actionbar height in the onCreateView() method:

TypedValue typedVal = new TypedValue();
getActivity().getTheme().resolveAttribute(R.attr.actionBarSize, typedVal, true); // use android.R when not using ABS
int actionBarHeight = getResources().getDimensionPixelSize(typedVal.resourceId);

And double the height if the actionbar is split:

if(isSplit) 
    actionBarHeight = actionBarHeight * 2;

It is not an ideal solution, but for me this works.

like image 3
Arno van der Ende Avatar answered Nov 15 '22 20:11

Arno van der Ende