我正在使用Tabs的ActionBar自定义视图。我的问题是自定义视图的排序。 Android正在显示 AFTER 标签 - 这是我不想要的。
我希望自定义视图显示 BEFORE 标签。
有没有办法自定义actionBar以在标签之前显示自定义视图?或者这不可能吗?
代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ActionBar bar = getActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
View customActionBarView =
getLayoutInflater().inflate(R.layout.home_actionbar, null, true);
ActionBar.LayoutParams lp =
new ActionBar.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.START;
bar.setCustomView(customActionBarView, lp);
bar.setLogo(R.drawable.logo);
bar.setHomeButtonEnabled(true);
bar.setDisplayShowCustomEnabled(true);
bar.addTab(bar.newTab()
.setText("Stuff")
.setTabListener(new TabListener<StuffFragment>(
this, "stuff", StuffFragment.class)));
bar.addTab(bar.newTab()
.setText("Friends")
.setTabListener(new TabListener<ContactsFragment>(
this, "friends", ContactsFragment.class)));
bar.addTab(bar.newTab()
.setText("Messages")
.setTabListener(new TabListener<ConversationsFragment>(
this, "messages", ConversationsFragment.class)));
if (savedInstanceState != null) {
bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
}
bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM |
ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO);
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
}
答案 0 :(得分:3)
这似乎是使用制表符和自定义视图时的预期行为。 https://code.google.com/p/android/issues/detail?id=36191#c3
如果你看看ActionBarSherlock - Tabs appearing ABOVE actionbar with custom view,许多其他人也会遇到这种情况,有些人提供了解决方案。
我无法让任何解决方案正常工作,但它们可能适合您。诀窍似乎是要确保徽标未设置为隐藏。呼叫
如果使用ActionBarSherlock,则getActionBar().setDisplayShowHomeEnabled(true)
或getSupportActionBar().setDisplayShowHomeEnabled(true)
。
然后致电:
View homeIcon = findViewById(
Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?
android.R.id.home : R.id.abs__home);
((View) homeIcon.getParent()).setVisibility(View.GONE);
((View) homeIcon).setVisibility(View.GONE);
这将获取对保存徽标的操作栏视图的引用,并将其设置为已启用,使自定义视图能够填充整个父视图,但应将选项卡保留在下面...
正如我所说,我无法实现这一目标,但有些人已经取得了成功。
祝你好运。答案 1 :(得分:2)
我遇到了同样的问题,我找到了解决问题的方法。 这不是一个“优雅”的解决方案,但它是我能找到的最好的解决方案。 首先,因为您要修改标准的ActionBar行为,所以必须强制ActionBar Sherlok始终使用非本机实现。 要做到这一点,打开ActionBarSherlok.java并注释这行代码:
registerImplementation(ActionBarSherlockNative.class);
然后删除所有值-v11 values-v14等,并确保始终扩展Theme.Sherlock而不是Theme.Holo
此时您确信ActionBar实现始终是Jake Wharton编写的实现。 剩下要做的就是按照你想要的方式制作ActionBar视图布局。 打开ActionBarView.java并在onLayout()方法中移动这段代码
if (mExpandedActionView == null) {
final boolean showTitle = mTitleLayout != null && mTitleLayout.getVisibility() != GONE &&
(mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0;
if (showTitle) {
x += positionChild(mTitleLayout, x, y, contentHeight);
}
switch (mNavigationMode) {
case ActionBar.NAVIGATION_MODE_STANDARD:
break;
case ActionBar.NAVIGATION_MODE_LIST:
if (mListNavLayout != null) {
if (showTitle) x += mItemPadding;
x += positionChild(mListNavLayout, x, y, contentHeight) + mItemPadding;
}
break;
case ActionBar.NAVIGATION_MODE_TABS:
if (mTabScrollView != null) {
if (showTitle) x += mItemPadding;
x += positionChild(mTabScrollView, x, y, contentHeight) + mItemPadding;
}
break;
}
}
就在这件作品之前
if (mProgressView != null) {
mProgressView.bringToFront();
final int halfProgressHeight = mProgressView.getMeasuredHeight() / 2;
mProgressView.layout(mProgressBarPadding, -halfProgressHeight,
mProgressBarPadding + mProgressView.getMeasuredWidth(), halfProgressHeight);
}
你已经完成了! 希望这有帮助
答案 2 :(得分:0)
将自定义视图添加到ActionBar时,您也可以指定重力。
ActionBar.LayoutParams lp = new ActionBar.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.LEFT;
customView.setLayoutParams(lp);
答案 3 :(得分:0)
使用ActionBarSherlock,这是所有Android版本的自定义ActionBar的非常好的实现,非常容易使用。
或者你可以使用自定义标题栏创建自己的ActionBar,并且它足够容易实现。您可以看到this和this示例是自定义标题栏的非常好的示例。
答案 4 :(得分:0)
您是否在为平板电脑制作应用?据我所知,动作栏的标签栏基本上出现在手机的下方。
如果在平板电脑上,我担心你无法调整标签的位置。我能想到的是你需要使用导航模式退出并创建一个自定义视图,它看起来像选项卡来替换actionBar选项卡。当然,这会导致很多额外的工作来处理导航内容。
答案 5 :(得分:0)
只需为主页按钮创建自定义视图即可。在此视图中,您可以将徽标和您尝试在左侧定位的自定义视图结合使用。然后正常添加标签
此解决方案的唯一缺点是您需要自己维护后退按钮的状态(如果您根本使用它)
答案 6 :(得分:0)
首先设置&#34; DisplayShowHomeEnabled&#34;动作栏的属性为&#34; true&#34;: actionBar.setDisplayShowHomeEnabled(真);
然后:
View homeIcon = findViewById(android.R.id.home);
((View) homeIcon.getParent()).setVisibility(View.GONE);
((View) homeIcon).setVisibility(View.GONE);
我希望它有所帮助:)