【问题标题】:Android: remove left margin from actionbar's custom layoutAndroid:从操作栏的自定义布局中删除左边距
【发布时间】: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。这个解决方案对你有用吗?

标签: android xml android-actionbar-compat


【解决方案1】:

如果您通过 XML 添加 Toolbar,您只需添加 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" />

【讨论】:

  • 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>

【讨论】:

【解决方案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_width="match_parent"
android:layout_height="wrap_content"
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_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">
      

      它看起来像这样

      【讨论】:

        【解决方案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_width="match_parent"
                  app:contentInsetLeft="0dp"
                  app:contentInsetStart="0dp"
                  android:layout_height="?attr/actionBarSize">
              
                  <!--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_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    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_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 Tips

                        【讨论】:

                          【解决方案18】:

                          只添加 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">
                          

                          【讨论】:

                            【解决方案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 或更高版本的设备中与系统状态栏重叠的问题。

                                【讨论】:

                                  猜你喜欢
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2015-08-22
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2016-09-23
                                  • 2015-09-12
                                  • 1970-01-01
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多