FAB: Drawable already belongs to another owner

点点圈 提交于 2019-12-07 16:16:39

问题


I added two floating action buttons on a fragment but I always get following error:

Invalid drawable added to LayerDrawable! Drawable already belongs to another owner but does not expose a constant state

<RelativeLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_margin="30dp"
android:layout_width="match_parent"
android:layout_height="match_parent">

    <ScrollView
        android:layout_weight="1"
        android:id="@+id/scrollView"
        android:layout_marginRight="30dp"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/layout_main_account">

            <TextView
                android:text="Name"
                android:textStyle="bold"
                android:layout_marginTop="30dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/tv_activity_main_account_name_label"/>

            <EditText
                android:enabled="false"
                android:inputType="none"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/et_activity_main_account_name_label_value"/>
        </LinearLayout>
    </ScrollView>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <View
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="0dp"/>

        <android.support.design.widget.FloatingActionButton
            android:backgroundTint="#000"
            android:layout_marginBottom="5dp"
            android:layout_marginRight="10dp"
            app:layout_anchorGravity="bottom"
            android:layout_width="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_edit_account"
            android:id="@+id/fbtn_activity_main_account_edit_account"/>

        <android.support.design.widget.FloatingActionButton
            android:backgroundTint="#000"
            android:layout_marginBottom="5dp"
            app:layout_anchorGravity="bottom"
            android:layout_width="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_home_account"
            android:id="@+id/fbtn_activity_main_account_manage_addresses"
            app:layout_anchor="@id/fbtn_activity_main_account_edit_account"/>

    </LinearLayout>
</RelativeLayout>

drawable -> ic_edit_account.xml

<vector android:height="24dp" android:viewportHeight="60.017"
android:viewportWidth="60.017" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF" android:pathData="M59.144,3.731l-2.85,-2.851c-1.164,-1.161 -3.057,-1.162 -4.221,0.001l-3.126,3.126H0v56h56V11.097l0.305,-0.305l0,0l2.839,-2.839C60.308,6.789 60.308,4.895 59.144,3.731zM20.047,36.759l3.22,3.22l-4.428,1.208L20.047,36.759zM52.062,12.206L47.82,7.964l1.414,-1.414l4.243,4.242L52.062,12.206zM50.648,13.62L25.192,39.076l-4.242,-4.242L46.406,9.378L50.648,13.62zM54,13.097v44.91H2v-52h44.947L18.829,34.127l-0.188,0.188l-2.121,7.779l-1.226,1.226c-0.391,0.391 -0.391,1.023 0,1.414c0.195,0.195 0.451,0.293 0.707,0.293s0.512,-0.098 0.707,-0.293l1.226,-1.226l7.779,-2.123l26.351,-26.35h0l0.447,-0.447L54,13.097zM57.73,6.539l-2.839,2.839l-4.243,-4.243l2.839,-2.839c0.384,-0.384 1.009,-0.383 1.393,0l2.85,2.85C58.114,5.529 58.114,6.155 57.73,6.539z"/>
</vector>

drawable -> ic_home_account.xml

<vector android:height="24dp" android:viewportHeight="512"
android:viewportWidth="512" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFFFF" android:pathData="M506.555,208.064L263.859,30.367c-4.68,-3.426 -11.038,-3.426 -15.716,0L5.445,208.064c-5.928,4.341 -7.216,12.665 -2.875,18.593s12.666,7.214 18.593,2.875L256,57.588l234.837,171.943c2.368,1.735 5.12,2.57 7.848,2.57c4.096,0 8.138,-1.885 10.744,-5.445C513.771,220.729 512.483,212.405 506.555,208.064z"/>
<path android:fillColor="#FFFFFFFF" android:pathData="M442.246,232.543c-7.346,0 -13.303,5.956 -13.303,13.303v211.749H322.521V342.009c0,-36.68 -29.842,-66.52 -66.52,-66.52s-66.52,29.842 -66.52,66.52v115.587H83.058V245.847c0,-7.347 -5.957,-13.303 -13.303,-13.303s-13.303,5.956 -13.303,13.303v225.053c0,7.347 5.957,13.303 13.303,13.303h133.029c6.996,0 12.721,-5.405 13.251,-12.267c0.032,-0.311 0.052,-0.651 0.052,-1.036v-128.89c0,-22.009 17.905,-39.914 39.914,-39.914s39.914,17.906 39.914,39.914v128.89c0,0.383 0.02,0.717 0.052,1.024c0.524,6.867 6.251,12.279 13.251,12.279h133.029c7.347,0 13.303,-5.956 13.303,-13.303V245.847C455.549,238.499 449.593,232.543 442.246,232.543z"/>
</vector>

build.gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion 26
defaultConfig {
    applicationId "com.atta"
    minSdkVersion 23
    targetSdkVersion 26
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support:design:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

// retrofit, gson
implementation 'com.google.code.gson:gson:2.6.2'
implementation 'com.squareup.okhttp3:okhttp:3.8.0'
implementation 'com.squareup.retrofit2:retrofit:2.0.2'
implementation 'com.basgeekball:awesome-validation:4.1'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
implementation 'com.squareup.okhttp3:logging-interceptor:3.8.0'
}

Note: Each drawable is used only once.

The following thread does not solve my problem:

Drawable already belongs to another owner but does not expose a constant state

Problem found: The following attribute is causing the exception:

android:backgroundTint="#000"

If I don't use it, there is a pink background on the FAB :(


回答1:


Fixed:

Added xmlns:app="http://schemas.android.com/apk/res-auto" in top layout

Used app:backgroundTint="@color/colorFABTint" instead of android:backgroundTint="#000"

Added following line in colors.xml

<color name="colorFABTint">#000000</color>

Resultant xml:

<RelativeLayout
    android:layout_margin="30dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

<android.support.design.widget.FloatingActionButton
                android:layout_marginBottom="5dp"
                app:layout_anchorGravity="bottom"
                android:layout_width="wrap_content"
                android:layout_gravity="bottom|end"
                android:layout_height="wrap_content"
                android:src="@drawable/ic_home_account"
                app:backgroundTint="@color/colorFABTint"
                android:id="@+id/fbtn_activity_main_account_manage_addresses"
                app:layout_anchor="@id/fbtn_activity_main_account_edit_account"/>



回答2:


Drawable has a state, and if you assign it to more than one Floating Action Button, then there will be a problem keeping track of the Drawable's state.

Maybe there is better solutions but one solution may be to set fab icons in onCreate instead of layout you can remove fab src from layout and use this:

fab.setImageResource(getResources().getDrawable(R.drawable.ic_edit_account).mutate());

or maybe this:

fab.setImageResource(getResources().getDrawable(R.drawable.ic_edit_account).getConstantState().newDrawable());


来源:https://stackoverflow.com/questions/51467857/fab-drawable-already-belongs-to-another-owner

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!