我在操作栏中有选项卡。 在大屏幕上,选项卡嵌入到操作栏中,但在小屏幕上则不是。 我想控制选项卡手册,以便我可以将选项卡与操作栏分开。 我试图设置abs__action_bar_embed_tabs,但没有奏效action_bar_embed_tabs如何在Android中正确工作?
<resources>
<bool name="abs__action_bar_embed_tabs">false</bool>
</resources>
我在操作栏中有选项卡。 在大屏幕上,选项卡嵌入到操作栏中,但在小屏幕上则不是。 我想控制选项卡手册,以便我可以将选项卡与操作栏分开。 我试图设置abs__action_bar_embed_tabs,但没有奏效action_bar_embed_tabs如何在Android中正确工作?
<resources>
<bool name="abs__action_bar_embed_tabs">false</bool>
</resources>
我找到了解决的选项卡中的代码中分离出来。
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
在ActionBarSherlock中,abs__action_bar_embed_tabs用于确定选项卡是否应嵌入到ActionBar中,并且该值存储在两个文件中。
这意味着只有当设备的宽度大于480dp时,制表符才会被嵌入。我认为这样的配置已经满足您的要求。
如果你想自己控制它,你可以用你想要的任何配置限定符创建你自己的值文件夹,并覆盖这个布尔值。
编辑: 好的,我试过了。它不能工作。事实上,它只在HONEYCOMB下工作。由于之前蜂巢sherlock行动栏有它自己的ActionBarImpl,所以你可以改变这个值。但是在ActionBar的本地实现中,这个值是com.android.internal.R.bool.action_bar_embed_tabs并且不能被修改。
所以..虽然我不赞成反射机制,但也许这是实现您的目标的唯一方法。
我很抱歉让你感到困惑。
在这个文件:ActionBarImpl.java
上private void setHasEmbeddedTabs(boolean hasEmbeddedTabs)
变化值:
mHasEmbeddedTabs = hasEmbeddedTabs;
到:
mHasEmbeddedTabs = false;
我知道这是旧的文章,但我想为未来的读者添加一个使用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) {}
}
然后调用此类似下面,
如果你想要的标签出现在操作栏里面,
setHasEmbeddedTabs(actionBar, true);
如果您希望制表符显示为se parate /下面的操作栏,
setHasEmbeddedTabs(actionBar, false);
所有学分Cliff.
它看起来像JB中嵌入的选项卡策略已更改。 摘录: “嵌入式选项卡的新ActionBar策略:无论屏幕大小如何,嵌入式选项卡现在总是在纵向模式下堆叠在操作栏中。” From: '''http:// developer.android.com/reference/android/os/Build.VERSION_CODES.html#JELLY_BEAN'''这实际上对我有效 - 在4.0.4上对它进行了测试。 –
感谢您的完美回答!很棒! –
谢谢,伙计!它在这里很好用! –
我试过这个解决方案,但标签仍然会出现在动作条。你能给我一个样品吗? – Rickyrick