AppCompat v7:21分割操作栏出现问题?

7

我正在开发一款应用程序,其中我使用了一个经过重大修改的分割操作栏。这里是该应用程序当前状态的链接:

screenshot

你会注意到顶部有一个透明的操作栏,其中填充了自定义视图,底部有一个临时拼凑的分割操作栏。底部视图实际上是一个单个的操作项,它填充了自定义视图,并将showAlways设置为true。

当前我只支持SDK v15+,并且我没有计划改变,但最近发布了Lollipop AppCompat库,因此我决定实现它,以便获得我的应用程序中的某些优点。

我已将主题更改为Theme.AppCompat.Light,并且我的MainActivity现在扩展ActionBarActivity而不是Activity。

现在所有对getActionBar的引用都已更改为getSupportActionBar,仅通过这些更改,我的活动现在看起来像这样:

another screenshot

你会注意到我从设备监视器中获取了一个UI转储,它将底部操作栏塞进了一个奇怪的空间,并将其称为操作栏,并且去掉了我的顶部自定义视图。

以下是设置我的操作栏的代码:

public void initializeActionBar(){
    View customNav = LayoutInflater.from(this).inflate(R.layout.action_bar_top, null);

    actionBar = getSupportActionBar();
    actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.transparent_fifty_percent));

    final PopupWindow window = addPopupWindow();

    actionBarOptions = (ImageView)customNav.findViewById(R.id.options);
    actionBarOptions.setVisibility(View.GONE);
    actionBarOptions.setImageDrawable(app.svgToBitmapDrawable(getResources(), R.raw.vertical_ellipsis, app.scaleByDensity(48)));
    actionBarOptions.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            window.showAsDropDown(actionBarOptions, 0, 0);
        }
    });
    TextView title = (TextView) customNav.findViewById(R.id.screen_title);
    Typeface font1 = Typeface.createFromAsset(getAssets(), "Merriweather-Italic.ttf");

    title.setText("Parsley");
    title.setTypeface(font1);

    actionBar.setCustomView(customNav);
    actionBar.setDisplayShowCustomEnabled(true);
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setDisplayShowHomeEnabled(false);
    actionBar.setDisplayUseLogoEnabled(false);

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    new MenuInflater(this).inflate(R.menu.test, menu);


    LinearLayout fullMenu = (LinearLayout) menu.findItem(R.id.full_menu).getActionView();


    ViewGroup.LayoutParams params;

    icon1 = (ImageView) fullMenu.findViewById(R.id.action_item1);
    params = icon1.getLayoutParams();
    params.width = getResources().getDisplayMetrics().widthPixels / 4;
    params.height = (int) (48 * getResources().getDisplayMetrics().density);

    icon1.setImageDrawable(app.svgToBitmapDrawable(getResources(), R.raw.shopping_list_icon, app.scaleByDensity(32)));
    icon2 = (ImageView) fullMenu.findViewById(R.id.action_item2);
    icon3 = (ImageView) fullMenu.findViewById(R.id.action_item3);
    icon4 = (ImageView) fullMenu.findViewById(R.id.action_item4);
    icon2.setImageDrawable(app.svgToBitmapDrawable(getResources(), R.raw.recipe_box_icon, app.scaleByDensity(32)));
    icon3.setImageDrawable(app.svgToBitmapDrawable(getResources(), R.raw.icon_search, app.scaleByDensity(32)));
    icon4.setImageDrawable(app.svgToBitmapDrawable(getResources(), R.raw.icon_add, app.scaleByDensity(32)));
    params = icon2.getLayoutParams();
    params.width = getResources().getDisplayMetrics().widthPixels / 4;
    params.height = (int) (48 * getResources().getDisplayMetrics().density);
    params = icon3.getLayoutParams();
    params.width = getResources().getDisplayMetrics().widthPixels / 4;
    params.height = (int) (48 * getResources().getDisplayMetrics().density);
    params = icon4.getLayoutParams();
    params.width = getResources().getDisplayMetrics().widthPixels / 4;
    params.height = (int) (48 * getResources().getDisplayMetrics().density);
    if (!firstLoad) {
        setBottomActionBarActive();
        setActiveTab(0);
    }

    optionsLoaded = true;

    return true;
}

initializeActionBar()是我在活动的onCreate中调用的。你有什么想法我做错了什么吗?


您可以创建一个自定义工具栏,并将其放置在上方或下方。请查看此帖子:http://stackoverflow.com/questions/34546160/how-to-enable-split-action-bar/34546493#34546493 - piotrek1543
3个回答

2

应该使用工具栏。在你的情况下,顶部有一个工具栏,底部也有一个。查看Android团队博客,他们有很好的集成指南。


1
你能提供一个链接,用于使用两个工具栏进行分割操作栏的集成吗? - Elli White
只需将两个工具栏添加到相对布局中。 工具栏是您布局的一部分,可以像其他视图一样使用。 - user4182277
对于那些寻找答案的人,这是我在Android开发者博客中找到的最接近“指南”的东西,希望这就是@user4182277所提到的内容。 - GrouchyPanda
使用两个工具栏。在这里查看如何进行第二次SplitToolbar:https://dev59.com/questions/JITba4cB1Zd3GeqP9rKU - kotucz

1
如果你只是想要恢复底部操作栏,你可以简单地切换回appcompat v7:20版本,这对我有效。问题在于,在appcompat v7:21中不再支持分割操作栏。

很好的发现,你有他们不支持在appcompat 21中拆分操作栏的来源吗? - Elli White
根据http://commonsware.com/blog/2014/11/18/android-5p0-deprecation-splitactionbarwhennarrow.html和https://code.google.com/p/android/issues/detail?id=77632#c2,分割操作栏已从appcompat_v7:21中静默删除。 - KCC

0

虽然user482277的解决方案可能适用于具有更传统的分割操作栏、使用操作项、导航抽屉等的实例,但对于我来说并不完全适用。最终我做的是构建了一对自定义(实际上是复合)视图来模拟顶部和底部的操作栏。我发现这种情况要好得多,特别是在向后兼容性方面。我不必担心早期版本是否支持操作栏,因为归根结底,它只是一对扩展LinearLayout的类。此外,我也不必担心不同的屏幕尺寸(特别是平板电脑)不支持分割版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接