【问题标题】:How to set space on left&right of the logo in the actionBar?如何在actionBar中的logo左右设置空间?
【发布时间】:2016-10-09 08:45:59
【问题描述】:

背景

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

@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);
    ...

问题

问题是,标志的左边似乎有太多的边距,而标题文本非常靠近标志本身,所以它看起来像这样:

这根本不是对称的……

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

我尝试过的

  1. 我尝试了其他尺寸的图标,另外我尝试使用位图而不是可绘制/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));
     }
    

但我仍然得到相同的结果:

  1. 我试过用这个:

     toolbar.setContentInsetsAbsolute(0,0);
    
  2. 我尝试在工具栏的xml标签中使用这个:

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

我还尝试使用其右侧和末尾的其他值(至少使空间大小相等),但它们似乎根本不影响徽标边距。

  1. 似乎唯一有用的是:

     app:contentInsetStartWithNavigation="0px"
    

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

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

  1. 我还尝试使用“布局检查器”工具调查为什么它有额外的空间,以便我可以强制它有更少的空间,但我找不到任何填充/边距导致这个:

问题

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

为什么会发生?

我应该改用自定义视图吗?

【问题讨论】:

  • 您对自定义视图有很大的控制权。
  • 能否请您展示如何模仿正常人的风格,以便用户不会注意到任何不同之处?真的没有其他官方方法可以克服这种行为吗?文字离标志很近,但标志离左边很远......
  • 这个project利用其自定义视图和自定义编排利用协调器布局的真正功能。
  • @Enzokie 你能用最少的代码演示一下吗?

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


【解决方案1】:

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

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

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

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

使用layout_marginLeft 的缺点是在徽标或自定义位图之前有另一个视图时效果不佳。例如,导航抽屉中的汉堡图标,启动子活动或打开导航抽屉时的向上插入符号(后退箭头)。发生这种情况是因为徽标被此类视图所取代。

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

        app:contentInsetStartWithNavigation="0dp"

为什么会发生?

也许,工具栏类使用了开发人员认为是标准尺寸的已设置尺寸,并且没有明确的方法来更改它们。

我应该改用自定义视图吗?

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

【讨论】:

  • 你测试了吗?有什么缺点吗?另外,关于自定义视图,你知道如何让它看起来像原生的,看起来像普通的 API 吗?
  • 是的,我已经在 API 21 和低至 API 16 上对此进行了测试。我已经编辑了我的答案,说明了缺点。
  • 有趣。为努力+1。请放一张截图来展示它的外观。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 2017-02-01
相关资源
最近更新 更多