2013-11-25 132 views
0

在我的應用程序中,我使用了一個ActionBar(下面的ABS或支持操作欄!minSDK = 14)。用戶可以選擇是否使用圖標或基於文本的選項卡。 我在處理屏幕旋轉時仍然遇到一些問題。基本上,我有一個customView設置在頂部(使用getActionBar.setCustomView()),其中放置了一些文本和控制元素。在縱向模式下一切正常,但旋轉設備弄亂了我的用戶界面。在運行時修改actionBar的外觀

我發佈了一些截圖來說明問題(圖標更改爲虛擬)。

這裏的問題是標籤堆疊,我發現沒有辦法強制ActionBar保持雙線。如果你知道如何去做,我會非常感謝你的解決方案。

因此,基於事實ActionBar將在橫向模式下保持單線,我至少試圖自定義選項卡文本背後的背景以匹配我的設計,並且工作。

真正的問題始於圖標模式。肖像:

enter image description here

一切都在這裏很好。旋轉設備:

enter image description here

因此,大家可以看到,有沒有空間了customView和片區域是在一條線。但是由於android dev團隊認爲他們的ActionBar比我們更聰明,系統完全忽略了空間不足,將標籤壓在一起並將customView放在右邊,導致它與標籤重疊。這完全混淆了我的用戶界面,並且我正在尋找任何可能的解決方案(由於某些原因,我不得不使用ActionBar而不是別的東西)。

如果您需要一些與設置ActionBar相關的代碼,我會發布它,儘管它幾乎是一個默認實現,所以我認爲這與問題無關。我正在問一些基本的想法如何解決所描述的問題。

+0

是圖標(問號)(應該是)的'ActionBar'的一部分,或者是他們獨立? – NitroNbg

+0

我爲我的actionBar使用NAVIGATION_MODE_TABS,並且還實現了onTabListener,它與ViewPager一起工作。因此,它們是AB – Droidman

+0

的一部分。我知道的唯一方法是創建整個View,它將成爲.xml中的'ActionBar',然後通過'getActionBar()。setCustomView(R.layout.yourID)'引用它。現在,如果這弄亂了你的肖像模式,嘗試使用分離的ActionBar,在你的''定義中加入''你的清單。希望這會解決您的問題在兩種模式。 – NitroNbg

回答

1

您可以使用反射來強制選項卡以縱向和橫向模式顯示在兩行上。 ActionBarImpl#setHasEmbeddedTabs(boolean)控制是否嵌入標籤(顯示爲下拉列表)或不嵌入。通過反思,我們會將布爾值false傳遞給它。

查看是否存在以下幫助:

ActionBar mActionBar = getActionBar(); 

// Set navigation mode  
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

// Initialize and add tabs  
for (int i=1; i <= 20; i++) { 
    Tab tab = mActionBar.newTab(); 
    tab.setText("Tab " + i); 
    tab.setTabListener(this); 
    mActionBar.addTab(tab); 
} 

Method setHasEmbeddedTabsMethod = null; 

try { 
    setHasEmbeddedTabsMethod = mActionBar.getClass(). 
            getDeclaredMethod("setHasEmbeddedTabs", 
                 boolean.class); 
} catch (NoSuchMethodException e1) { 
    e1.printStackTrace(); 
} 

setHasEmbeddedTabsMethod.setAccessible(true); 

try { 
    setHasEmbeddedTabsMethod.invoke(mActionBar, false); 
} catch (IllegalArgumentException e) { 
    e.printStackTrace(); 
} catch (IllegalAccessException e) { 
    e.printStackTrace(); 
} catch (InvocationTargetException e) { 
    e.printStackTrace(); 
} 
+0

你救了我的一天,謝謝!還有兩個問題:我必須從清單中刪除'android:configChanges =「orientation | screenSize」'以使您的代碼正常工作。爲什麼?你能解釋一下它的工作原理嗎?據我瞭解,ActionBar具有系統專用的'setHasEmbeddedTabs'方法,在這裏您明確告訴系統使用該方法。這是對的嗎? – Droidman

+0

@Droidman第一個問題:'configChanges =「orientation」'可以防止操作系統在方向改變時破壞和重新創建你的Activity(你已經知道這一點)。該標誌表示開發人員通過Activity的onConfigurationChanged(Configuration)方法在內部處理方向更改。但是,'ActionBar'有它自己的'onConfigurationChanged(...)'方法,並猜測它做了什麼:它調用'setHasEmbeddedTabs()'...(續) – Vikram

+0

@Droidman(繼續)...因此,如果你希望在清單中保留'configChanges',你需要覆蓋你的活動的'onConfigurationChanged(...)'並在'super'調用之後調用反射代碼('Method setHasEmbeddedTabsMethod = null;'向前)。目前,我想你可以在'onCreate(..)'中調用這段代碼。通過刪除'configChanges',每當方向改變時調用'onCreate(..)'方法,我們就沒事了。 – Vikram