9

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!

pakerfeldt
  • 1,491
  • 1
  • 14
  • 23

3 Answers3

5

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)

BeNeXuS
  • 497
  • 5
  • 11
3

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.

2

The bottom bar should match the height of the regular action bar. Thus, using ?android:attr/actionBarSize (or in ActionBarSherlock's case ?attr/actionBarSize) for the height in XML or getResources().getDimensionPixelSize(R.attr.actionBarSize) in code should suffice.

edit:

Er, on a second read of your question it seems more focused on also determining whether or not the split action bar exists.

You may want to read these answers and the follow-up comments by Adam Powell, action bar guru:

Community
  • 1
  • 1
Jake Wharton
  • 75,598
  • 23
  • 223
  • 230
  • Yes, I also need to know if it exists at all. Anyway, I was told (by Roman I think) on Android Office Hours that this was simply not possible. At least not in an easy and straight forward way. Therefore, we are now experimenting with a single top action bar and mimic the bottom action bar with a regular view instead. This solves not only this issue but another one as well where we wanted to "force" some actions to the top action bar. – pakerfeldt Apr 18 '12 at 11:29