AppCompat v7:21拆分操作栏是否损坏?

我目前正在开发一个应用程序,其中使用了大量修改的拆分操作栏。 以下是该应用当前状态的链接:

截图

您会注意到顶部有一个透明的动作栏,其中添加了一个自定义视图,底部还有一个黑色的分离动作栏。 底部视图实际上是一个具有自定义视图的单个操作项目,并且showAlways = true。

目前我只支持SDK v15 +,但我并没有真正计划改变这种情况,但是随着刚刚发布的Lollipop AppCompat库,我决定实施它,以便在应用程序中获得一些令人惊叹的效果。

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

所有对getActionBar的引用现在都被切换到了getSupportActionBar,并且只有这些更改,这就是我的活动现在的样子:

另一个截图

您会注意到我从设备监视器获得了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;
}

在我的活动中,从onCreate调用initializeActionBar()。 任何想法我做错了什么?


应该使用工具栏。 在你的情况下,它的顶部是一个工具栏,底部是一个。 检查Android团队博客,他们有很好的整合指南。


如果你只是想要你的底部操作栏,你可以简单地改回appcompat v7:20,它对我很有用。 问题是appcomat v7:21不再支持拆分操作栏。


虽然user482277的解决方案可能适用于具有更传统的拆分操作栏,利用操作项目,导航抽屉等的实例,但它并不适合我。 我最终做的是构建一对自定义(复合真实)视图来模拟顶部和底部的操作栏。 我发现这种情况会更好,尤其是在向后兼容性方面。 我不必担心支持动作栏的早期版本,因为在一天结束时,它只是一对延伸LinearLayout的类。 另外,我不必担心不支持分割版本的不同屏幕尺寸(特别是平板电脑)。

链接地址: http://www.djcxy.com/p/23307.html

上一篇: AppCompat v7:21 Split Action Bar Broken?

下一篇: Dataflow with splitting work to small jobs and then group again