Search code examples
androidandroid-actionbarandroid-tabsnexus-7

ActionBar with navigation tabs changes height with screen orientation


My goal is to increase the ActionBar height for portrait mode. I currently set

android:actionBarSize

in my Themes.xml.

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="DayTheme" parent="android:style/Theme.Holo.Light">
        <item name="android:actionBarSize">@dimen/actionBarHeight</item>
        <item name="android:actionBarTabTextStyle">@style/tab_indicator_text_dark</item>
    </style>
    <style name="NightTheme" parent="android:style/Theme.Holo">
        <item name="android:actionBarSize">@dimen/actionBarHeight</item>
        <item name="android:actionBarTabTextStyle">@style/tab_indicator_text_light</item>
    </style>
</resources>

I get the desired effect in landscape mode where I have increased the ActionBar height to 80dp.

enter image description here

However, went I rotate the screen into portrait mode the height changes like so.

enter image description here

Note I make the following calls in code.

final ActionBar bar = getActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
bar.setDisplayShowTitleEnabled(false);
bar.setDisplayShowHomeEnabled(false);

I am developing on a Nexus 7 with android 4.2.

How do I get the same 80dp height in portrait mode that I have in landscape mode?


Solution

  • You wrote:

    How do I get the same 80dp height in portrait mode that I have in landscape mode?

    By setting both the Application theme attribute android:actionBarSize and the ActionBar.TabView style attribute android:minHeight (or height) to 80 dip.

    A basic example:

    <style name="ThemeHoloWithActionBar" parent="android:Theme.Holo.Light">
        <item name="android:actionBarTabStyle">@style/ActionBarTabStyle</item>
        <item name="android:actionBarSize">80dip</item>
    </style>
    
    <style name="ActionBarTabStyle" parent="@android:style/Widget.Holo.ActionBar.TabView">
        <item name="android:minHeight">80dip</item>
    </style>
    

    Set theme in Manifest:

       <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/ThemeHoloWithActionBar" >
    

    Add some tabs to the ActionBar in an Activity:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        ActionBar actionbar = getActionBar();
        actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionbar.setDisplayShowTitleEnabled(false);
        actionbar.setDisplayShowHomeEnabled(false);
        ActionBar.Tab tabA = actionbar.newTab().setText("Tab A");
        ActionBar.Tab tabB = actionbar.newTab().setText("Tab B");
        ActionBar.Tab tabC = actionbar.newTab().setText("Tab C");
    
        tabA.setTabListener(new MyTabsListener());
        tabB.setTabListener(new MyTabsListener());
        tabC.setTabListener(new MyTabsListener());
    
        actionbar.addTab(tabA);
        actionbar.addTab(tabB);
        actionbar.addTab(tabC);
    }
    

    This produces tabs with 80 dip height in portrait mode:

    enter image description here

    and tabs with 80 dip height in landscape mode:

    enter image description here

    EDIT:

    For this example, SDK versions in the Manifest were set to:

    android:minSdkVersion="12"
    android:targetSdkVersion="15"
    

    According to OP, the example works with these SDK settings. However, if targetSkdVersion is instead set to 16 or 17, the example doesn't work. OP has filed a bug report: