4

我在操作欄中有選項卡。 在大屏幕上,選項卡嵌入到操作欄中,但在小屏幕上則不是。 我想控制選項卡手冊,以便我可以將選項卡與操作欄分開。 我試圖設置abs__action_bar_embed_tabs,但沒有奏效action_bar_embed_tabs如何在Android中正確工作?

<resources> 
    <bool name="abs__action_bar_embed_tabs">false</bool> 
</resources> 

回答

6

我找到了解決的選項卡中的代碼中分離出來。

private void embeddedTabs(Object actionBar, Boolean embed_tabs) { 
    try { 
     if (actionBar instanceof ActionBarWrapper) { 
      // ICS and forward 
      try { 
       Field actionBarField = actionBar.getClass() 
         .getDeclaredField("mActionBar"); 
       actionBarField.setAccessible(true); 
       actionBar = actionBarField.get(actionBar); 
      } catch (Exception e) { 
       Log.e("", "Error enabling embedded tabs", e); 
      } 
     } 
     Method setHasEmbeddedTabsMethod = actionBar.getClass() 
       .getDeclaredMethod("setHasEmbeddedTabs", boolean.class); 
     setHasEmbeddedTabsMethod.setAccessible(true); 
     setHasEmbeddedTabsMethod.invoke(actionBar, embed_tabs); 
    } catch (Exception e) { 
     Log.e("", "Error marking actionbar embedded", e); 
    } 
} 

但現在我有一個新問題。標籤不會完全填充標籤欄。 Actionbar tabs don't fill the tabbar

1

在ActionBarSherlock中,abs__action_bar_embed_tabs用於確定選項卡是否應嵌入到ActionBar中,並且該值存儲在兩個文件中。

  1. In values/abs__bools.xml。這是錯誤的。
  2. In values-w480/abs__bools.xml。這是真的。

這意味着只有當設備的寬度大於480dp時,製表符纔會被嵌入。我認爲這樣的配置已經滿足您的要求。

如果你想自己控制它,你可以用你想要的任何配置限定符創建你自己的值文件夾,並覆蓋這個布爾值。

編輯: 好的,我試過了。它不能工作。事實上,它只在HONEYCOMB下工作。由於之前蜂巢sherlock行動欄有它自己的ActionBarImpl,所以你可以改變這個值。但是在ActionBar的本地實現中,這個值是com.android.internal.R.bool.action_bar_embed_tabs並且不能被修改。

所以..雖然我不贊成反射機制,但也許這是實現您的目標的唯一方法。

我很抱歉讓你感到困惑。

在這個文件
+0

我試過這個解決方案,但標籤仍然會出現在動作條。你能給我一個樣品嗎? – Rickyrick

0

:ActionBarImpl.java

private void setHasEmbeddedTabs(boolean hasEmbeddedTabs)

變化值:
mHasEmbeddedTabs = hasEmbeddedTabs;

到:
mHasEmbeddedTabs = false;

9

我知道這是舊的文章,但我想爲未來的讀者添加一個使用action_bar_embed_tabs的解決方案。

創建下面的方法(做照顧進口的),

public static void setHasEmbeddedTabs(Object inActionBar, final boolean inHasEmbeddedTabs) 
{ 
    // get the ActionBar class 
    Class<?> actionBarClass = inActionBar.getClass(); 

    // if it is a Jelly Bean implementation (ActionBarImplJB), get the super class (ActionBarImplICS) 
    if ("android.support.v7.app.ActionBarImplJB".equals(actionBarClass.getName())) 
    { 
      actionBarClass = actionBarClass.getSuperclass(); 
    } 

    try 
    { 
      // try to get the mActionBar field, because the current ActionBar is probably just a wrapper Class 
      // if this fails, no worries, this will be an instance of the native ActionBar class or from the ActionBarImplBase class 
      final Field actionBarField = actionBarClass.getDeclaredField("mActionBar"); 
      actionBarField.setAccessible(true); 
      inActionBar = actionBarField.get(inActionBar); 
      actionBarClass = inActionBar.getClass(); 
    } 
    catch (IllegalAccessException e) {} 
    catch (IllegalArgumentException e) {} 
    catch (NoSuchFieldException e) {} 

    try 
    { 
      // now call the method setHasEmbeddedTabs, this will put the tabs inside the ActionBar 
      // if this fails, you're on you own <img src="http://www.blogc.at/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley"> 
      final Method method = actionBarClass.getDeclaredMethod("setHasEmbeddedTabs", new Class[] { Boolean.TYPE }); 
      method.setAccessible(true); 
      method.invoke(inActionBar, new Object[]{ inHasEmbeddedTabs }); 
    } 
    catch (NoSuchMethodException e)  {} 
    catch (InvocationTargetException e) {} 
    catch (IllegalAccessException e) {} 
    catch (IllegalArgumentException e) {} 
} 

然後調用此類似下面,

  1. 如果你想要的標籤出現在操作欄裏面,

    setHasEmbeddedTabs(actionBar, true);

  2. 如果您希望製表符顯示爲se parate /下面的操作欄,

    setHasEmbeddedTabs(actionBar, false);

所有學分Cliff.

+0

它看起來像JB中嵌入的選項卡策略已更改。 摘錄: 「嵌入式選項卡的新ActionBar策略:無論屏幕大小如何,嵌入式選項卡現在總是在縱向模式下堆疊在操作欄中。」 From: '''http:// developer.android.com/reference/android/os/Build.VERSION_CODES.html#JELLY_BEAN'''這實際上對我有效 - 在4.0.4上對它進行了測試。 –

+0

感謝您的完美回答!很棒! –

+0

謝謝,夥計!它在這裏很好用! –