Android:从操作栏的自定义布局中删除左边距

Posted

技术标签:

【中文标题】Android:从操作栏的自定义布局中删除左边距【英文标题】:Android: remove left margin from actionbar's custom layout 【发布时间】:2015-02-05 22:05:49 【问题描述】:

我正在使用自定义操作栏视图,正如您在下面的屏幕截图中看到的那样,操作栏中有一个空白的灰色空间。我想删除它。

我做了什么:

res/values-v11/styles.xml

<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light">
        <item name="android:actionBarStyle">@style/ActionBarStyle</item>
        <item name="actionBarStyle">@style/ActionBarStyle</item>
</style>

res/values/my_custom_actionbar.xml

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="ActionBarStyle" parent="@style/Widget.AppCompat.Light.ActionBar.Solid">
        <item name="android:height">60dp</item>
    </style>
</resources>

清单

<uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="19" />

<application
            android:icon="@drawable/ic_launcher"
            android:label="@string/AppName"
            android:theme="@style/AppBaseTheme" >
    <!-- activities... etc -->
</application>

MainActivity

public void onCreate(Bundle bundle) 
    super.onCreate(bundle);

    ActionBar actionbar = getSupportActionBar();

    actionbar.setDefaultDisplayHomeAsUpEnabled(false);
    actionbar.setDisplayHomeAsUpEnabled(false);
    actionbar.setDisplayShowCustomEnabled(true);
    actionbar.setDisplayShowHomeEnabled(false);
    actionbar.setDisplayShowTitleEnabled(false);
    actionbar.setDisplayUseLogoEnabled(false);
    actionbar.setHomeButtonEnabled(false);

    // Add the custom layout
    View view = LayoutInflater.from(this).inflate(R.layout.actionbar, null, false);
    actionbar.setCustomView(view);

我发现了一个最近的帖子,指出最新版本存在问题。我还将 ADT 和 SDK 更新到了 Android 5。

Android ActionBar's custom view not filling parent

我不知道该怎么办。

编辑(部分解决方案):

不适用于 Android

Android Lollipop, AppCompat ActionBar custom view doesn't take up whole screen width

我改变了什么:

使用最新的sdk版本:

<uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="21" />

添加toolbarStyle

<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light">
        <item name="android:actionBarStyle">@style/ActionBarStyle</item>
        <item name="actionBarStyle">@style/ActionBarStyle</item>

        <item name="android:toolbarStyle">@style/ToolbarStyle</item>
        <item name="toolbarStyle">@style/ToolbarStyle</item>
</style>

<style name="ToolbarStyle" parent="@style/Widget.AppCompat.Toolbar">
    <item name="contentInsetStart">0dp</item>
    <item name="android:contentInsetStart">0dp</item>
</style>

【问题讨论】:

你见过this post @Zbarcea 它对我不起作用。对于 android:toolbarStyle IDE 投诉需要 api 级别 21 分钟是 11。这个解决方案对你有用吗? 【参考方案1】:

如果您通过 XML 添加 Toolbar,您只需添加 XML 属性即可删除内容插入。

<android.support.v7.widget.Toolbar
    xmlns:app="schemas.android.com/apk/res-auto"
    android:layout_
    android:layout_
    android:background="@color/primaryColor"
    android:contentInsetLeft="0dp"
    android:contentInsetStart="0dp"
    app:contentInsetLeft="0dp"
    app:contentInsetStart="0dp"
    android:contentInsetRight="0dp"
    android:contentInsetEnd="0dp"
    app:contentInsetRight="0dp"
    app:contentInsetEnd="0dp" />

【讨论】:

xmlns:app="schemas.android.com/apk/res-auto" 适用于所有缺少 xml 'app' 部分的人。 使用“app:”和“android:”有什么区别..? 它们是不同的命名空间。 “android”命名空间传统上用于 Android 操作系统定义的所有属性。 “app”命名空间传统上用于由您的应用程序定义的属性,通过导入库或在 attrs.xml 文件中添加您自己的库。请记住,命名空间“句柄”可以是您想要的任何名称,它是使用根布局上的 xmlns 属性定义的,或者在这种情况下,是在布局元素本身中定义的。如果您愿意,可以将其设为“xmlns:nougat”。即在 Android 数据绑定中,我通常使用“绑定”来绑定适配器。 在我的情况下,将此属性添加到 android.support.v7.widget.Toolbar 的设计 xml 中:app:contentInsetStartWithNavigation="0dp" 就足够了。 正如varotariyavajsi 和computingfreak 提到的——使用app:contentInsetStartWithNavigation="0dp"app:contentInsetStart="0dp" 就足够了,这取决于您是否显示导航(抽屉或向上按钮)。它也适用于androidx.appcompat.widget.Toolbar【参考方案2】:

试试这个:

    ActionBar actionBar = getSupportActionBar();
    actionBar.setDisplayShowHomeEnabled(false);
    actionBar.setDisplayShowCustomEnabled(true);
    actionBar.setDisplayShowTitleEnabled(false);
    View customView = getLayoutInflater().inflate(R.layout.main_action_bar, null);
    actionBar.setCustomView(customView);
    Toolbar parent =(Toolbar) customView.getParent();
    parent.setPadding(0,0,0,0);//for tab otherwise give space in tab
    parent.setContentInsetsAbsolute(0,0);

我在我的项目中使用了这个代码,祝你好运;

【讨论】:

太棒了! parent.setContentInsetsAbsolute(0,0) 可以解决问题! 这行得通。但是,它可以稍微改变布局。或者,您可以使用 actionBar.setCustomView(R.layout.app_title_bar); Toolbar parent =(Toolbar) actionBar.getCustomView().getParent(); parent.setContentInsetsAbsolute(0,0); 而不是膨胀布局。 不适合我,虽然 my problem 只是略有不同。 只有 SDK>21 才支持 setContentInsetsAbsolute 函数。任何解决方案 必须为平板电脑添加parent.setPadding(0, 0, 0, 0);【参考方案3】:

左插图是由 Toolbar 的contentInsetStart 引起的,默认为 16dp。

将其更改为与关键线对齐。

支持库 v24.0.0 更新:

为了匹配 Material Design 规范,还有一个附加属性 contentInsetStartWithNavigation,默认为 16dp。如果您还有导航图标,请更改此设置。

事实证明,这是设计库第 24 版中引入的新材料设计规范的一部分。

https://material.google.com/patterns/navigation.html

但是,可以通过将以下属性添加到工具栏小部件来删除多余的空间。

app:contentInsetStartWithNavigation="0dp"

之前:

之后:

【讨论】:

这个解决方案对我使用 Android Jetpack (androidx) 有效【参考方案4】:

我发现了另一个改变工具栏样式的解决方案(参考 appcompat-v7 ),代码如下:

<item name="toolbarStyle">@style/Widget.Toolbar</item>


<style name="Widget.Toolbar" parent="@style/Widget.AppCompat.Toolbar">
<item name="contentInsetStart">0dp</item>
</style>

【讨论】:

如果你能帮助我,请看看这个***.com/questions/31359608/…。 我会检查并告诉你【参考方案5】:
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_
android:layout_
app:contentInsetLeft="0dp"
app:contentInsetStart="0dp"
android:paddingLeft="0dp">

这应该足够了。

【讨论】:

【参考方案6】:

只需修改你的styles.xml

<!-- ActionBar styles -->
    <style name="MyActionBar" parent="Widget.AppCompat.ActionBar">
        <item name="contentInsetStart">0dp</item>
        <item name="contentInsetEnd">0dp</item>
    </style>

【讨论】:

【参考方案7】:

仅将app:contentInsetStart="0dp" 添加到工具栏删除剩余的空间。

所以您的工具栏定义如下所示

 <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_
    app:contentInsetStart="0dp"
    android:layout_
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

它看起来像这样

【讨论】:

【参考方案8】:

只需将app:contentInsetStart="0dp" 添加到工具栏的 XML 属性即可。

【讨论】:

【参考方案9】:

您可以设置自定义视图,而不是在布局中添加工具栏。

Toolbar parent = (Toolbar) customView.getParent();
parent.setContentInsetsAbsolute(0,0);

【讨论】:

【参考方案10】:

使用AppCompatAcitivty,您可以通过

Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
View logo = getLayoutInflater().inflate(R.layout.custom_toolbar, null);
mToolbar.addView(logo, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
mToolbar.setContentInsetsAbsolute(0,0);

【讨论】:

【参考方案11】:

如果您查看工具栏的文档,默认情况下它已定义样式并且有一个项目 contentInsetStart。

<item name="contentInsetStart">16dp</item>

如果您想覆盖此填充,则可以通过两种方式完成。

1.覆盖样式并使用 contentInsetStart 和 contentInsetEnd 值添加您自己的样式

<style name="MyActionBar" parent="Widget.AppCompat.ActionBar">
    <item name="contentInsetStart">0dp</item>
    <item name="contentInsetEnd">0dp</item>
</style>

2.在XML中可以直接定义contentInsetStart和contentInsetEnd值

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_
    app:contentInsetLeft="0dp"
    app:contentInsetStart="0dp"
    android:layout_>

    <!--Add your views here-->

</androidx.appcompat.widget.Toolbar>

【讨论】:

【参考方案12】:

您需要在工具栏中添加这一行 app2:contentInsetStart="0dp"

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app2="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_
    android:layout_
    android:background="@color/colorPrimary"
    app2:contentInsetStart="0dp"/>

【讨论】:

对我来说是app:contentInsetStart="0dp"【参考方案13】:

这对我有用

toolbar.setPadding(0,0,0,0);
toolbar.setContentInsetsAbsolute(0,0);

【讨论】:

【参考方案14】:

在工具栏中将“contentInset...”属性设置为 0 对我不起作用。 Nilesh Senta 更新风格的解决方案奏效了!

styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="actionBarStyle">@style/Actionbar</item>
    <item name="android:titleTextStyle">@style/ActionbarTitle</item>
</style>

<style name="Actionbar" parent="Widget.AppCompat.ActionBar">
    <item name="contentInsetStart">0dp</item>
    <item name="contentInsetEnd">0dp</item>
</style>

java (onCreate)

ActionBar actionBar =  getSupportActionBar();

actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setDisplayShowCustomEnabled(true);

ActionBar.LayoutParams layoutParams = new ActionBar.LayoutParams(
            ActionBar.LayoutParams.MATCH_PARENT,
            ActionBar.LayoutParams.MATCH_PARENT
    );

View view = LayoutInflater.from(this).inflate(R.layout.actionbar_main, null);

actionBar.setCustomView(view, layoutParams);

【讨论】:

【参考方案15】:

科特林

    supportActionBar?.displayOptions = ActionBar.DISPLAY_SHOW_CUSTOM;
    supportActionBar?.setCustomView(R.layout.actionbar);

    val parent = supportActionBar?.customView?.parent as Toolbar
    parent?.setPadding(0, 0, 0, 0)//for tab otherwise give space in tab
    parent?.setContentInsetsAbsolute(0, 0)

【讨论】:

【参考方案16】:

我在任何地方都没有找到我的问题(第一张图片)的解决方案,但经过几个小时的挖掘,我最终找到了一个最简单的解决方案。请注意,我尝试了很多 xml 属性,例如 app:setInsetLeft="0dp" 等。但在这种情况下它们都没有帮助。

图片1

以下代码解决了这个问题,如图 2 所示

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    //NOTE THAT: THE PART SOLVED THE PROBLEM.
    android.support.design.widget.AppBarLayout abl = (AppBarLayout)
            findViewById(R.id.app_bar_main_app_bar_layout);

    abl.setPadding(0,0,0,0);

图2

【讨论】:

【参考方案17】:

像这样创建工具栏:

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/menuToolbar"
android:layout_
android:layout_
android:layout_margin="0dp"
android:background="@color/white"
android:contentInsetLeft="10dp"
android:contentInsetRight="10dp"
android:contentInsetStart="10dp"
android:minHeight="?attr/actionBarSize"
android:padding="0dp"
app:contentInsetLeft="10dp"
app:contentInsetRight="10dp"
app:contentInsetStart="10dp"></android.support.v7.widget.Toolbar>

请点击此链接了解更多信息 - Android Tips

【讨论】:

【参考方案18】:

只添加 android:padding="0dp" 为我工作

<android.support.v7.widget.Toolbar
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_
    android:layout_
    android:padding="0dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

【讨论】:

【参考方案19】:
ActionBar ab = getSupportActionBar();
ab.setDisplayShowHomeEnabled(true);
      ab.setDisplayShowCustomEnabled(true);
      setDisplayShowTitleEnabled(true);
      View customView =     getLayoutInflater().inflate(R.layout.activity_main,null); //here activity_main.xml is the GUI design file.
ab.setCustomView(customView);
Toolbar parent =(Toolbar) customView.getParent(); //use V7 Toolbar import
parent.setContentInsetsAbsolute(0, 0);
setPadding(5,0,0,0);

ab.setIcon(R.mipmap.ic_launcher);

【讨论】:

【参考方案20】:

您可以在 xml 文件中的工具栏视图组内使用相对布局,并根据您的用例需要调整小部件的位置。无需创建自定义布局并将其膨胀并附加到工具栏。在您的 java 代码中完成后,将 setContentInsetsAbsolute(0,0) 与您的工具栏对象一起使用,然后再将其设置为布局中的支持操作栏。

【讨论】:

【参考方案21】:

最好在app actionbar的样式中添加一个背景项,使其与自定义actionbar的背景颜色保持一致:

<item name="android:background">@color/actionbar_bgcolor</item>

android 6.0以后,actionbar甚至还有margin-right空间,不能设置。像这样在activity中添加一个右边距调整:(view是自定义的actionbar或其中的右键)

int rightMargin = Build.VERSION.SDK_INT>=Build.VERSION_CODES.M ? 0 : 8; // may the same with actionbar leftMargin in px
ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
p.setMargins(p.leftMargin, p.topMargin, rightMargin, p.bottomMargin);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
    p.setMarginEnd(rightMargin);

view.setLayoutParams(p);

Android 3.0+ 应用后才支持操作栏机制。如果我们使用工具栏(支持 lib v7),我们应该在每个活动的每个 xml 中布局它,并注意在 Android 5.0 或更高版本的设备中与系统状态栏重叠的问题。

【讨论】:

以上是关于Android:从操作栏的自定义布局中删除左边距的主要内容,如果未能解决你的问题,请参考以下文章

如何更改操作栏上菜单项的位置

Android Studio中自定义标题栏的添加问题

使用带有选项卡布局的自定义视图时无法从选项卡中删除填充

Android中搜索栏的自定义拇指

从 XML 布局中的自定义视图中删除包前缀

在Android中销毁布局时覆盖的方法