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


269

我使用的是自定义操作栏视图,如下面的屏幕截图所示,操作栏中有空白的灰色空间。我要删除它。

在此处输入图片说明

我做了什么:

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>

主要活动

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的自定义视图未填充父级

我不知道该怎么办。

编辑(部分解决方案):

无法在Android <= API 10上运行。

Android Lollipop,AppCompat ActionBar自定义视图不会占用整个屏幕宽度

我改变了什么:

使用最新的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>

1
您是否看到过这个帖子
Kaushik 2014年

1
@Zbarcea在我的末端无法正常工作。,对于android:toolbarStyle IDE,有关require api级别21 min的投诉为11。
程序员

Answers:


609

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

<android.support.v7.widget.Toolbar
    xmlns:app="schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    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" />

2
xmlns:app =“ schemas.android.com/apk/res-auto ”,用于缺少xml的“ app”部分的每个人。
Prakash

3
使用“ app:”和“ android:” ..有什么区别?
微小的

3
它们是不同的名称空间。传统上,“ android”命名空间用于Android OS定义的所有属性。传统上,“ app”名称空间用于通过导入库或在attrs.xml文件中添加自己的属性来定义由应用程序定义的属性。请记住,名称空间“句柄”可以是您想要的任何名称,它是使用根布局上的xmlns属性定义的,或者在这种情况下,是在布局元素本身中定义的。如果愿意,可以将其设置为“ xmlns:nougat”。即在Android数据绑定中,我通常对bindingAdapters使用“ bind”。
LukeWaggoner '16

@idratherbeintheair我在工具栏中有一个搜索视图,但是当我使用可见性将其隐藏时,边框表示搜索视图的边界表示工具栏上仍显示某种边框。有什么想法吗?
Jay Rathod RJ

24
在我的情况下,添加以下属性来设计的XML android.support.v7.widget.Toolbarapp:contentInsetStartWithNavigation="0dp"就够了。
Computingfreak

198

试试这个:

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

我在项目中使用了此代码,祝您好运;


4
优秀的!parent.setContentInsetsAbsolute(0,0)可以解决问题!
巴姆2015年

7
这可行。但是,它可以稍微改变布局。或者,您可以做actionBar.setCustomView(R.layout.app_title_bar); Toolbar parent =(Toolbar) actionBar.getCustomView().getParent(); parent.setContentInsetsAbsolute(0,0);而不是扩大布局。
Markymark 2015年

尽管我的问题略有不同,但不适用于我。
安慰

仅当SDK> 21时才支持功能setContentInsetsAbsolute。任何解决方案
Pramod J George

11
必须添加parent.setPadding(0, 0, 0, 0);平板电脑
Alexandre G

47

左插图是由工具栏的 contentInsetStart,默认情况下为16dp。

更改它以使其与关键点对齐。

支持库v24.0.0的更新:

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

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

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

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

app:contentInsetStartWithNavigation="0dp"

之前: 在此处输入图片说明

之后: 在此处输入图片说明


这个解决方案是使用Android Jetpack(androidx)对我有效的方法
Francisc0

27

我找到了另一个解决方案(参考appcompat-v7),它改变了toolbarStyle,如下代码:

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


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

如果可以帮助我,请查看此stackoverflow.com/questions/31359608/…
Prashant Kedia

我将检查并让您了解
madhu527 2015年

14
<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_width="match_parent"
android:layout_height="wrap_content"
app:contentInsetLeft="0dp"
app:contentInsetStart="0dp"
android:paddingLeft="0dp">

这应该足够好。


11

只需修改您的styles.xml

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

8

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

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

7

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

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

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

它看起来像这样

在此处输入图片说明


4

使用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);

3

您需要在工具栏中添加以下行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_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/colorPrimary"
    app2:contentInsetStart="0dp"/>

2
对我来说是 app:contentInsetStart="0dp"
Adil Soomro

1

我在任何地方都没有找到解决问题的方法(第一张图),但经过数小时的挖掘,最后我得到了最简单的解决方案。请注意,我尝试了很多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

在此处输入图片说明


1

在工具栏中将“ 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);

0

像这样创建工具栏:

<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_width="match_parent"
android:layout_height="wrap_content"
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提示


0

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

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

0
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);

0

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


0

最好将背景项目添加到应用程序操作栏的样式中,以与自定义操作栏的背景颜色一致:

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

在android 6.0之后,操作栏甚至还有一个空白边距空间,无法设置。在活动中添加一个右边距调整,如下所示:(该视图是自定义操作栏或其中的右键)

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及更高版本的应用程序之后才支持actionbar机械化。如果改用工具栏(支持lib v7),则应将其布置在每个活动的每个xml中,并注意与Android 5.0或更高版本设备中的系统状态栏重叠的问题。


0

科特林

    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)

0

这项工作对我来说

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

0

如果您查看工具栏的文档,则默认情况下已定义了样式,并且有一个项目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_width="match_parent"
    app:contentInsetLeft="0dp"
    app:contentInsetStart="0dp"
    android:layout_height="?attr/actionBarSize">

    <!--Add your views here-->

</androidx.appcompat.widget.Toolbar>

-1

您的应用程序支持android 5吗?如果不支持,则可以降级支持Actionbar v7的版本。看起来像:

编译'com.android.support:appcompat-v7:19.0.+'(不要使用v7:21+)

还可以使应用程序的目标版本小于21。

targetSdkVersion 14

如果您的应用支持android 5->,则需要自定义工具栏。(因为appcombat-v7:21有一些更改)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.