【问题标题】:AppCompat v7:21 Split Action Bar Broken?AppCompat v7:21 拆分操作栏坏了?
【发布时间】:2014-12-18 08:22:19
【问题描述】:

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

您会注意到顶部有一个透明的操作栏,其中包含一个自定义视图,底部有一个被破解的拆分操作栏。底部视图实际上是一个单独的操作项,其中包含一个自定义视图并且 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;
}

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

【问题讨论】:

标签: android android-actionbar android-appcompat


【解决方案1】:

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

【讨论】:

  • 您能否链接到集成以使用两个工具栏作为拆分操作栏?
  • 只需在相对布局中添加两个工具栏。工具栏是布局的一部分,可以像任何其他视图一样使用
  • 对于那些来这里寻找答案的人来说,这与我在android developers blog 上可以找到的“指南”一样接近,希望这就是@user4182277 所指的内容
  • 使用两个工具栏。看这里如何做第二个SplitToolbar:stackoverflow.com/questions/26627612/…
【解决方案2】:

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

【讨论】:

【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多