Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何自定义Android ActionBar以在选项卡之前显示自定义视图?_Android_Android Actionbar - Fatal编程技术网

如何自定义Android ActionBar以在选项卡之前显示自定义视图?

如何自定义Android ActionBar以在选项卡之前显示自定义视图?,android,android-actionbar,Android,Android Actionbar,我正在使用带有选项卡的ActionBar的自定义视图。我的问题是自定义视图的顺序。Android在标签后面显示它,这是我不想要的 我希望自定义视图显示在选项卡之前 有没有办法自定义actionBar以在选项卡之前显示自定义视图?或者这是不可能的 代码: 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); 最终ActionBar=getActionBar(); 设置导航模式(操作栏导航模式选项卡);

我正在使用带有选项卡的ActionBar的自定义视图。我的问题是自定义视图的顺序。Android在标签后面显示它,这是我不想要的

我希望自定义视图显示在选项卡之前

有没有办法自定义actionBar以在选项卡之前显示自定义视图?或者这是不可能的

代码:

创建时受保护的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);