Android - Activity Home/向上箭头在 SDK 24 中具有额外的填充/边距

Posted

技术标签:

【中文标题】Android - Activity Home/向上箭头在 SDK 24 中具有额外的填充/边距【英文标题】:Android - Activity Home/Up arrow has additional padding/margin with SDK 24 【发布时间】:2016-10-18 00:10:24 【问题描述】:

我刚刚将我的应用从使用 SDK 23 更新到 SDK 24。

显示向上/主页箭头(即getSupportActionBar().setDisplayHomeAsUpEnabled(true))的活动出现问题,因为现在向上箭头和活动标题之间有额外的(不需要的)空间。

对于没有向上箭头的活动,活动标题与之前的位置完全相同,这表明额外的填充/边距与向上箭头相关联,而不是与活动标题相关联。

我的问题是如何更改布局,使其在 SDK 24 中看起来与在 SDK 23 中相同?

向上箭头和使用 SDK 23 的标题之间的小间隙:

使用 SDK 24 的向上箭头和标题之间存在较大(不需要的)间隙:

这是我的旧 build.gradle (SDK 23):

apply plugin: 'com.android.application'

android 
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig 
        applicationId "com.example.myapp"
        minSdkVersion 19
        targetSdkVersion 23
        versionCode 42
        versionName "0.42"
    
    buildTypes 
        release 
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
    
    packagingOptions 
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    


dependencies 
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.google.android.gms:play-services-vision:9.0.2'
    compile 'ch.acra:acra:4.7.0'
    compile 'com.android.support:support-v4:23.4.0'
    compile 'com.android.support:recyclerview-v7:23.4.0'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0'
    compile 'com.android.support:support-v13:23.4.0'
    compile 'com.journeyapps:zxing-android-embedded:3.2.0@aar'
    compile 'com.google.zxing:core:3.2.1'

这是新的 build.gradle (SDK 24):

apply plugin: 'com.android.application'

android 
    compileSdkVersion 24
    buildToolsVersion "23.0.3"

    defaultConfig 
        applicationId "com.example.myapp"
        minSdkVersion 19
        targetSdkVersion 24
        versionCode 42
        versionName "0.42"
    
    buildTypes 
        release 
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
    
    packagingOptions 
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    


dependencies 
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.google.android.gms:play-services-vision:9.0.2'
    compile 'ch.acra:acra:4.7.0'
    compile 'com.android.support:support-v4:24.0.0'
    compile 'com.android.support:recyclerview-v7:24.0.0'
    compile 'com.android.support:appcompat-v7:24.0.0'
    compile 'com.android.support:design:24.0.0'
    compile 'com.android.support:support-v13:24.0.0'
    compile 'com.journeyapps:zxing-android-embedded:3.2.0@aar'
    compile 'com.google.zxing:core:3.2.1'

【问题讨论】:

顺便可以使用buildToolsVersion "24" 如果我尝试这样做,它会显示“未能找到构建工具修订版 24.0.0”......但它也为您提供了安装它的链接。 :-)(顺便说一句,它并没有解决问题。) 您从 SDK 管理器下载了 Android SDK Build-tools 吗? 根据 Android SDK,一切都是最新的,但我已经安装了 Build Tools rev 24.0.0。不过,问题仍然存在。 我也看到了这个。似乎如果您将所有支持库从 24.0.0 降级到 23.4.0,它就会恢复正常。所以这似乎是一个支持库的问题? 【参考方案1】:

这已在 Android 问题跟踪器中得到解答。链接是:

https://code.google.com/p/android/issues/detail?id=213826

app:contentInsetStartWithNavigation="0dp" 添加到工具栏视图。

【讨论】:

这正是我所做的【参考方案2】:

我认为这种填充是符合 SDK 24 中 Material 规范的新标准。 首先,您必须通过此代码隐藏默认工具栏标题:

getSupportActionBar().setDisplayShowTitleEnabled(false);

然后创建一个名为toolbar.xml 的文件并将这些代码添加到该文件中:

<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/toolbar"
    android:layout_
    android:layout_
    android:background="@color/primary_color"
    app:theme="@style/ThemeOverlay.AppCompat"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:contentInsetStartWithNavigation="0dp">

    <TextView
        android:id="@+id/toolbar_title"
        android:layout_
        android:layout_
        android:layout_marginLeft="16dp" <!-- Add margin -->
        android:layout_marginStart="16dp"
        android:gravity="left|center"
        android:text="Toolbar Title" <!-- Your title text -->
        android:textColor="@color/white" <!-- Matches default title styles -->
        android:textSize="20sp"
        android:fontFamily="sans-serif-medium"/>

</android.support.v7.widget.Toolbar>

如您所见,您可以控制此文件中的所有内容。查看toolbar.xml中的这一行:

app:contentInsetStartWithNavigation="0dp"

这就是你想要的。祝你好运。

【讨论】:

OK,所以这里主要的要求是把ActionBar换成Toolbar。我不需要你的TextView,所以这是我的toolbar.xml:` schemas.android.com/apk/res/android" xmlns:app="schemas.android.com/apk/res-auto" android:id=" @+id/toolbar" android:layout_ android:layout_ android:background="?android:attr/colorPrimary" android:minHeight="?android:attr/actionBarSize" app:contentInsetStartWithNavigation="0dp " > ` 我通过在每个活动布局文件中添加&lt;include layout="@layout/toolbar"/&gt; 将工具栏添加到我的活动中。 然后更新我所有活动的代码的最简单方法是将此方法添加到我的 BaseActivity 文件(我所有的活动都扩展): @Override public void setContentView(int layoutResId) super.setContentView(layoutResId); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) toolbar.setTitle(getTitle()); //toolbar.setSubtitle("Subtitle"); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayShowHomeEnabled(true); 我很高兴它成功了。所以如果你不介意,请接受我的回答。谢谢。【参考方案3】:

尝试使用此代码删除不需要的空间 根据你的用途使用它:-

<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/toolbar_bottom"
    android:layout_
    android:layout_
    android:background="@color/red"
    android:contentInsetLeft="0dp"
    android:contentInsetStart="0dp"
    app:contentInsetLeft="0dp"
    app:contentInsetStart="0dp"
    android:contentInsetRight="0dp"
    android:contentInsetEnd="0dp"
    app:contentInsetRight="0dp"
    app:contentInsetEnd="0dp"
    android:minHeight="?attr/actionBarSize">
 </android.support.v7.widget.Toolbar>

【讨论】:

以上是关于Android - Activity Home/向上箭头在 SDK 24 中具有额外的填充/边距的主要内容,如果未能解决你的问题,请参考以下文章

Android:按home后恢复应用程序时,应用程序始终从根Activity启动

android activity弹出为啥向右

Android - Activity Home/向上箭头在 SDK 24 中具有额外的填充/边距

Android 中back键和home键的区别

从 Activity 向服务发送消息 - Android

Android——Activity生命周期