如何在actionBar中设置徽标左侧和右侧的空间?

时间:2016-10-09 08:46:00

标签: android android-actionbar android-toolbar graphical-logo

背景

我想在活动标题的左侧显示一个位图,在操作栏(确切地说是工具栏)中,所以我使用了这个:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setLogo(R.mipmap.ic_launcher);
    ...

问题

事实上,徽标左侧边缘似乎太多,而标题文字非常靠近徽标本身,所以它看起来像这样:

enter image description here

这根本不对称......

如果我有导航抽屉,情况会更糟:

enter image description here

我尝试了什么

  1. 我尝试了其他尺寸的图标,而且我尝试使用位图而不是drawable / mipmap资源(我实际上还需要使用位图),因此:

    TypedValue tv = new TypedValue();
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
        int actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
        Bitmap bitmap = Bitmap.createBitmap(actionBarHeight, actionBarHeight, Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        final Paint paint = new Paint();
        paint.setColor(0xffff0000);
        canvas.drawPaint(paint);
        getSupportActionBar().setLogo(new BitmapDrawable(getResources(),bitmap));
    }
    

    但我仍然得到了同样的结果:

    enter image description here

  2. 我试着用这个:

    toolbar.setContentInsetsAbsolute(0,0);
    
  3. 我试图在工具栏的xml标签中使用它:

    android:contentInsetLeft="0px"
    android:contentInsetStart="0px"
    

    我还尝试将其他值放到右侧和右侧(为了至少使空间大小相等),但它们似乎根本不会影响徽标边距。

  4. 只有看起来有帮助的是这个:

    app:contentInsetStartWithNavigation="0px"
    

    但只有有导航抽屉时才有用:

    enter image description here

    在没有导航抽屉的情况下,我仍然看到额外的空间,这使得它在徽标左侧看起来与其右侧相比看起来不均匀。我试图将此值设置为负数,但在没有导航抽屉的情况下它没有做任何事情。

  5. 我还尝试使用"布局检查器"来调查为什么它有额外的空间。工具,以便我可以强制它占用更少的空间,但我找不到任何会导致这种情况的填充/边距:

    enter image description here

  6. 问题

    如何避免这种行为?如何最小化/设置徽标左侧和右侧的空间?

    为什么会发生?

    我应该只使用自定义视图吗?

1 个答案:

答案 0 :(得分:3)

  

如何最小化/设置徽标左侧和右侧的空间?

在工具栏中使用这些属性来处理工具栏视图的边距。

        android:layout_marginLeft="-16dp"
        app:titleMarginStart="@dimen/your_required_space"

-16dp留下大约4dp的空间。

使用layout_marginLeft的缺点是,当徽标或自定义位图之前有另一个视图时,它无法正常工作。例如,导航抽屉时的汉堡包图标,启动子活动或打开导航抽屉时的向上插入图标(后箭头)。发生这种情况是因为徽标被这些视图取代。

在这种情况下,您可以使用:

        app:contentInsetStartWithNavigation="0dp"
  

为什么会发生?

也许,工具栏类使用已设置的维度,开发人员认为这些维度是标准维度,并且没有明确的方法来改变它们。

  

我应该只使用自定义视图吗?

您可以在完全控制时使用自定义视图,但使用自定义视图时,您会遇到自定义问题。