如何自定义Android ActionBar以在选项卡之前显示自定义视图?
我正在使用带有选项卡的ActionBar的自定义视图。我的问题是自定义视图的顺序。Android在标签后面显示它,这是我不想要的 我希望自定义视图显示在选项卡之前 有没有办法自定义actionBar以在选项卡之前显示自定义视图?或者这是不可能的 代码:如何自定义Android ActionBar以在选项卡之前显示自定义视图?,android,android-actionbar,Android,Android Actionbar,我正在使用带有选项卡的ActionBar的自定义视图。我的问题是自定义视图的顺序。Android在标签后面显示它,这是我不想要的 我希望自定义视图显示在选项卡之前 有没有办法自定义actionBar以在选项卡之前显示自定义视图?或者这是不可能的 代码: 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); 最终ActionBar=getActionBar(); 设置导航模式(操作栏导航模式选项卡);
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
最终ActionBar=getActionBar();
设置导航模式(操作栏导航模式选项卡);
视图customActionBarView=
getLayoutFlater().充气(R.layout.home\u actionbar,null,true);
ActionBar.LayoutParams lp=
新的ActionBar.LayoutParams(LayoutParams.WRAP_内容,
LayoutParams.WRAP_内容);
lp.gravity=gravity.START;
bar.setCustomView(customActionBarView,lp);
酒吧。设置标志(右拉深。标志);
bar.setHomeButtonEnabled(真);
bar.setDisplayShowCustomEnabled(真);
bar.addTab(bar.newTab()
.setText(“东西”)
.setTabListener(新的TabListener(
这是“东西”,StuffFragment.class);
bar.addTab(bar.newTab()
.setText(“朋友”)
.setTabListener(新的TabListener(
这是“朋友”,ContactsFragment.class);
bar.addTab(bar.newTab()
.setText(“消息”)
.setTabListener(新的TabListener(
这是“消息”,ConversationsFragment.class);
如果(savedInstanceState!=null){
bar.setSelectedNavigationItem(savedInstanceState.getInt(“选项卡”,0));
}
设置显示选项(ActionBar.DISPLAY\u SHOW\u CUSTOM)
ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO);
设置导航模式(操作栏导航模式选项卡);
}
将自定义视图添加到操作栏时,还可以指定重力
ActionBar.LayoutParams lp = new ActionBar.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.LEFT;
customView.setLayoutParams(lp);
这是一个非常好的自定义ActionBar的实现,适用于所有android版本,并且非常容易使用
或者,您可以使用自定义标题栏创建自己的ActionBar,并且它非常容易实现。您可以看到和示例都是非常好的自定义标题栏示例。这似乎是使用选项卡和自定义视图时的预期行为。 如果你看看其他很多人也经历过这种情况,有些人提供了解决方案 我一直无法使任何解决方案起作用,但它们可能对您有效。诀窍似乎是要确保标识不被设置为隐藏。呼叫
getActionBar().setDisplayShowHomeEnabled(true)
或getSupportActionBar().setDisplayShowHomeEnabled(true)
如果使用ActionBar Sherlock
然后打电话:
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);
这将获得一个对包含徽标的actionbar视图的引用,并将其设置为GoneWith,使自定义视图能够填充整个父视图,但应将选项卡保留在下面
正如我所说,我无法让这项工作,但有些人已经取得了成功
祝你好运。我也遇到了同样的问题,我找到了解决办法。 这不是一个“优雅”的解决方案,但它是我能找到的最好的解决方案。 首先,既然您想要修改标准ActionBar行为,那么您必须强制ActionBar Sherlok始终使用非本机实现。 为此,请打开ActionBarSherlok.java并注释这行代码:
registerImplementation(ActionBarSherlockNative.class);
然后删除所有值-v11值-v14等,确保始终扩展Theme.Sherlock和never-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);
}
你完了!
希望这有所帮助您是否正在为平板电脑制作应用程序?据我所知,actionbar的标签栏基本上出现在手机的it下方。
如果在平板电脑上,恐怕您无法调整标签的位置。我能想到的是,您需要退出使用导航模式,并创建一个看起来像选项卡的自定义视图来替换actionBar选项卡。当然,这会导致处理导航内容的大量额外工作。只需为主页按钮创建自定义视图即可。在此视图中,您可以将徽标和要放置在左侧的自定义视图组合在一起。然后像平常一样添加选项卡 此解决方案唯一的缺点是您需要自己维护后退按钮的状态(如果您使用它)首先将actionbar的“DisplayShowHomeEnabled”属性设置为“true”: actionBar.setDisplayShowHomeEnabled(真) 然后:
View homeIcon = findViewById(android.R.id.home);
((View) homeIcon.getParent()).setVisibility(View.GONE);
((View) homeIcon).setVisibility(View.GONE);
我希望它有帮助:)我们需要查看一些代码。此外,您应该尝试更清楚地了解您所说的
之前
和之后是什么意思。将它们大写并不会使事物变得晶莹剔透。使用代码进行更新,并到处搜索diagramive。似乎无法控制actionbar上每个项目(徽标、选项卡、自定义视图和菜单)的位置。fml!是的,使用自定义视图可能会变得棘手。如果我是你的话,我会更多地干扰你的自定义视图,或者使用自定义选项卡。你能分享R.layout.home\u actionbar布局吗?很可能我尝试过很多不同的解决方案,包括上面提到的,但都没有成功。相反,我决定放弃动作栏,实现一些完全定制的东西。那么,如果你不能让它工作,为什么要否决它呢?我的回答是正确的,这正是黑客攻击动作条的精神。很好的建议,成功了!
View homeIcon = findViewById(android.R.id.home);
((View) homeIcon.getParent()).setVisibility(View.GONE);
((View) homeIcon).setVisibility(View.GONE);