web-dev-qa-db-ja.com

サポートライブラリVectorDrawable Resources $ NotFoundException

Design Support Libraryバージョン23.4.を使用しています。私はgradleフラグを有効にしました:

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

ビルドツールバージョン23.0.2を使用していますが、それでもキットカット以下でResources$NotFoundExceptionを取得しています。

Android:drawableLeftまたはimageView.setImageResource(R.drawable.drawable_image)を使用すると発生します。

そして、はい、私はドロアブルを使用しているすべてのアクティビティにこれを入れています

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

これはサポートライブラリのバグですか?

67
Arka

サポートライブラリ23.4.0を使用してこれを機能させるには、3つのことを行いました。

  1. これをbuild.gradleに追加します

    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
    
  2. 次をアプリケーションクラスのonCreateに追加します

    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    
  3. ベクトル描画可能置換を設定しているすべてのxmlビューについて

    Android:src
    

    app:srcCompat
    

    そして、コードでこれを置き換えます:

    imageView.setImageResource(...);
    

    imageView.setImageDrawable(...);
    
73
Rich Luick

ここでの回答の一部を補足するために、VectorDrawablesの下位互換性のあるサポートには料金がかかり、すべての場合に機能しません

どの場合に機能しますか? この図 を作成しました(サポートライブラリ23.4.0から少なくとも25.1.0で有効)。

VectorDrawable cheatsheet

56
David Ferrand

使用してみてください:

imageView.setImageDrawable(VectorDrawableCompat.create(getResources(), drawableRes, null));

このようにAppCompatDelegate.setCompatVectorFromResourcesEnabled(true);を追加する必要はありません。

VectorDrawableCompatを使用してベクタードロウアブルを膨らませるだけで、準備は完了です。

29
Andrei Lupsa

同じ問題がありました。ベクターのドロアブルはキットカットでは表示されませんでした。アクティビティのonCreateメソッドにAppCompatDelegate.setCompatVectorFromResourcesEnabled(true);を追加することで、この問題を解決しました。

その前に追加することを忘れないでください:

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

そして、ベクタードロウアブルを使用するビューのsetImageResourceを呼び出します。私の見解はImageButtonです。 Android SDKビルドツールバージョン23.0.3があります

25
Murat

パーティーに遅れてすみませんが、この回答は、すべてのアクティビティでフラグAppCompatDelegate.setCompatVectorFromResourcesEnabled(true);を有効にするユーザーに役立つ場合があります。

1。アプリケーション(Android.app.Application)に拡張するクラスを作成します

public class MyApplicationClass extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();
    }
}

2。Manifest.xmlに移動して、次の行をタグに追加します

<application
    Android:name=".MyApplicationClass"
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:roundIcon="@mipmap/ic_launcher_round"
    Android:supportsRtl="true"
    Android:theme="@style/AppTheme">
    ...
</application>

。MyApplicationClass.JavaでonCreateの上に次のコードを追加

// This flag should be set to true to enable VectorDrawable support for API < 21
static
{
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

MyApplicationClass.Javaの完全なコード

import Android.app.Application;
import Android.support.v7.app.AppCompatDelegate;

/**
* Created by Gaurav Lonkar on 23-Dec-17.
*/

public class MyApplicationClass extends Application
{
    // This flag should be set to true to enable VectorDrawable support for API < 21
    static
    {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }

    @Override
    public void onCreate()
    {
        super.onCreate();
    }
}
14
zackygaurav
defaultConfig {
  vectorDrawables.useSupportLibrary = true
}

app.gradleでこれを使用します

次に、AppCompatDrawableManagerを使用してsetDrawableとgetDrawableを設定します。私のために働く

8
emilpmp

サポートライブラリ23.3では、Android:drawableLeftなどの場所でのベクトルドロウアブルのサポートが無効になりました。 Google + :で発表されました

バージョン23.2.0/23.2.1の実装で見つかった問題のために、Lollipop以前のデバイス上のリソースからベクトルドロウアブルを使用できる機能を削除することにしました。 app:srcCompatとsetImageResource()の使用は引き続き機能します。

問題へのリンク:

ただし、これらの問題に対処できる場合は、23.4で AppCompatDelegate.setCompatVectorFromResourcesEnabled() を使用してこの機能を再度有効にできます。

これがどのように機能するのか興味がある場合は、この機能を作成したChris Banesから学ぶのが最適です。彼は詳細に説明します 彼のブログで

7

変化する

imageView.setImageResource(R.drawable.drawable_image)

imageView.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.drawable_image));

xmlでvectordrawableを使用する場合は、これを使用します。

app:srcCompat="@drawable/drawable_image"
4
jmarkstar

ベクターをdrawable-anydpiに入れないでください。古いデバイスではサポートされていません

それらをdrawableに入れます

1
sajad

私はずっと前に同様の問題を抱えていた、それは設定によって動作しませんでした

vectorDrawables.useSupportLibrary = true

「mipmap」フォルダを作成したときにのみ機能し、使用したコード

imageView.setImageResource (R.mipmap.drawable_image)

さらに情報があります こちら

1
Marco Giovanni

私の特定のケースでは、次のように、セレクタ内のいくつかのベクトルで画像リソースとして描画可能なセレクタを使用していたため、この問題が発生しました:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_selected="true" Android:drawable="@drawable/vector_select_blue"/>
    <item Android:state_pressed="true" Android:drawable="@drawable/vector_select_black"/>
    .
    .
    etc
</selector>

はい、かなり悪いですが、当時はよくわかりませんでした。

したがって、これを行う正しい方法は、次のようにベクトルファイルでtintプロパティを使用することです。

<vector ..vector properties..
        Android:tint="@color/vector_color_selector">
              <path ..path properties../>
</vector>

(AppCompatImageViewでapp:tint属性を使用することもできます)

そして今、あなたのvector_color_selectorファイルは、次のようにあなたが望む色を持つべきです:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_selected="true" Android:color="@color/blue"/>
    <item Android:state_pressed="true" Android:color="@color/black"/>
    .
    .
    etc
</selector>

以前の回答がうまくいかなかった場合、これが誰かの助けになることを願っています。明白なことを述べますが、私はまだgradleでvectorDrawables.useSupportLibrary = trueを設定し、AppCompatImageViewを使用し、app:srcCompatまたはsetImageDrawable + AppCompatResources.getDrawableを使用してベクターcompatライブラリの問題を回避する必要があると言わなければなりません。

1
emirua

Harish Gyananiがコメントで言ったように、AppCompatImageViewの代わりにImageViewを使用してください。

公式ドキュメント

0
Krishna