web-dev-qa-db-ja.com

無効なドロウアブルタグベクトル

以前のLollipopデバイスでベクタードロウアブルを使用しようとしています。指示どおりにすべてを行いました ここ ですが、このクラッシュはまだ発生しています。

build.gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:2.0.0-beta6'
    }
}
apply plugin: 'com.Android.application'

repositories {
    maven { url 'http://maven.Android-forever.com' }
    jcenter()
}

Android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.test.app"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.Android.support:appcompat-v7:23.2.0'
    compile 'com.Android.support:design:23.2.0'
    compile "de.greenrobot:eventbus:2.4.0"
    compile 'de.greenrobot:greendao:2.1.0'
    compile "com.af:Android-utility:1.0.0.9"
    compile project(':volleyplus')
    compile project (':libvlc')
}

triangle.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@drawable/triangle_v"/>
</selector>

triangle_v.xml

<vector xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:height="100dp"
    Android:width="100dp"
    Android:viewportHeight="100"
    Android:viewportWidth="100">

<path
    Android:name="triangle"
    Android:fillColor="#FF0000"
    Android:pathData="m 50,0 l 50,100 -100,0 z"/>

</vector>

layout.xml

<ImageView
      Android:layout_width="match_parent"
      Android:layout_height="match_parent"
      Android:background="@drawable/triangle"/>

私も試してみましたapp:srcCompatそしてその場合、drawableは表示されません。

38
pedja

問題は、私のアクティビティがAppCompatActivityではなく、通常のActivityを拡張していることでした。

これはサポートベクタードロウアブルのドキュメント/例では指定されていません

18
pedja

このコードは、使用している場合、ベクターで動作します
vectorDrawables.useSupportLibrary = true

変更Android:srcからapp:srcCompat

例えば、

<ImageView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:src="@drawable/triangle"/>

<ImageView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    app:srcCompat="@drawable/triangle"/>
29

私も同様の問題に直面しましたが、@ pedja自身の答えが役立ちます。より一般的には、 Chris Banesのvector drawable compatに関する記事 で述べたように、サポートライブラリは、いくつかのフックを介してpre-LにあるシステムにImageViewのバージョンを注入することで機能します。これには、AppCompatActivityなどのAppCompatバージョンのクラスを使用する必要があります。

私の場合、ベクトルドロアブルは、アプリケーションコンテキストを使用して、アクティビティが関連付けられていないスタンドアロンのトーストのようなビューで使用されます。私はxmlレイアウト定義でAppCompatImageViewを直接使用することになりました。

<Android.support.v7.widget.AppCompatImageView
             Android:id="@+id/some_id"
             Android:layout_width="24dp"
             Android:layout_height="24dp"
             Android:src="@drawable/selector_referencing_vector_drawable"/>

したがって、魔法の「フック」メカニズムは必要ありません。テストしたとおり、これはActivityを使用する必要なくAppCompatActivityクラスでも機能します。上記のすべては23.2.1にアップグレードせずに行われ、別の問題に対処しました。

27
headuck

Lollipop以前のデバイスでセレクターからベクターを読み込むときにもこの問題が発生しました。

OnCreateメソッドでAppCompatDelegate.setCompatVectorFromResourcesEnabled(true)を使用します。

Android.graphics.drawable.DrawableContainerリソース内で、古いプラットフォーム(<API 21)のベクタードロウアブルを使用できるかどうかを設定します。有効にすると、AppCompatはフレームワークからのドロアブルインフレーションをインターセプトできます。これにより、Android.graphics.drawable.DrawableContainerリソース内のベクトルドロアブルの暗黙的なインフレーションが可能になります。

protected final void onCreate(Bundle savedInstanceState) {
         AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
         super.onCreate(savedInstanceState);
         ...
25
Aldasa

ここで与えられる答えは、同じエラーを与えるため、テキストビューにドロアブルを追加したい状況を無視しています。私の場合、私は持っていた

<TextView .... Android:drawableLeft="some_vectore_drawable" />

私はこれを解決する方法を見つけることができなかったので、その行をxmlコードから削除して、この方法でJavaコードに入れました

Drawable somevectordrable = AppCompatDrawableManager.get().getDrawable(context, R.drawable.somevectordrawable);
mytextview.setCompoundDrawableWithIntrinsicBounds(somevectordrable, null, null, null);

コードの明確化、

  1. AppCompatDrawableManagerを使用して、drawablesフォルダーからベクトルdrawableを取得します

  2. テキストビューの左側のドロアブルとして取得したドロアブルを設定します

10
nada

新しいベクターサポートライブラリも含める必要があります。

compile 'com.Android.support:support-vector-drawable:23.2.0'
6
Gaëtan

23.3.0ではなく23.2.0または23.4.0で動作します。真剣にグーグル!

最初に、この機能は当初23.2.0でリリースされましたが、メモリ使用量と構成の更新の問題がいくつか見つかったため、23.3.0で削除しました。 23.4.0(技術的には修正リリース)で、同じ機能を再度追加しましたが、フラグを手動で有効にする必要があります。

参照: https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88#.waicp19gh

6
Nishant Shah

インターネットで好きなのはそれだけです。あなたが見逃しているものをチェックしてください。

1)内部build.gradle

 Android {
        ...
        defaultConfig {
            ...
            vectorDrawables.useSupportLibrary = true
        }
  }

2)buildToolsVersion '27.0.3'およびcompile 'com.Android.support:appcompat-v7:27.0.3'同様のバージョンコードを使用する必要があります。

3)上位、次に3段階のバージョンを使用
classpath 'com.Android.tools.build:gradle:3.0.1'

4)ImageViewにはapp:srcCompatを使用します

xmlns:app="http://schemas.Android.com/apk/res-auto"
app:srcCompat="@drawable/ic_logo"

5)ただし、Android:drawableLeftまたはAndroid:drawableRigthなどが必要な場合:

ic_logo.xml(ベクターxml)

<vector xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:width="@dimen/home.button.icon"
    Android:height="@dimen/home.button.icon"
    Android:viewportWidth="24.0"
    Android:viewportHeight="24.0"
    tools:ignore="VectorRaster">
    <path
        Android:fillColor="#FFFFFF"
        Android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
</vector>

ic_logo_select.xml(ベクターセレクター)

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_checked="true"
        Android:drawable="@drawable/ic_logo" />
    <item Android:drawable="@drawable/ic_logo" />
</selector>

これでAndroid:drawableLeftまたはAndroid:drawableRightを使用できます

<Android.support.v7.widget.AppCompatButton
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:drawableLeft="@drawable/ic_logo_select"/>

6)最後に、メインメソッドの前に読み込まれる静的内部でsetCompatVectorFromResourcesEnabled = trueになります。

public class MainActivity extends AppCompatActivity {
     static {
            AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
     }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ....
    }
}
5

drawableLeftdrawableRightdrawableTopdrawableXxxなどでこの例外の問題がある場合...そしてプロジェクトbuildToolsVersion> 26.0.2

アプリレベルのgradleファイルを確認し、vectorDrawables.useSupportLibrary = trueが存在する場合は削除し、クラッシュします。

これは、buildToolsが26.0.2以降にベクターリソースを破棄するためですが、何らかの理由でvectorDrawables.useSupportLibrary = trueと競合します。

2019/03/27にテスト済み。

(アプリレベルのgradleファイルでbuildToolsVersionが見つからない場合は、Android Gradle 3.0.0以降のプラグインを使用していることを意味し、プロジェクトは自動的にプラグインが指定するビルドツールのデフォルトバージョン。この場合、buildToolsVersionは既に26.0.2より大きい

2
Loyea

これは、API 19に表示されるsupport-v4、appcompat-v7ライブラリv23.2.0のバグです。@ timは、このバグの問題へのリンクを提供します。

新しいライブラリバージョン23.2.1にアップグレードでき、バグが修正されました。

1
sytolk

drawableLeft/drawableStartなどでこの問題が発生している場合、データバインディングを使用している場合、簡単な解決策があります。

の代わりに:

Android:drawableLeft="@drawable/somevector" ❌

行う:

Android:drawableLeft="@{@drawable/somevector}" ✅

これは、データバインディングが互換性のある方法でドロウアブルを取得するコードをコンパイル時に生成するためです。

1
BoD

Code.googleでこの問題を見つけました。

それはあなたと同じ問題のようです。これは役立ちますか? https://code.google.com/p/Android/issues/detail?id=20184

0
tim

ベクトルドロアブルをロードするときに<Android.support.v7.widget.AppCompatImageViewを使用している場合は、AppCompatActivityの代わりにActivityを拡張し、通常の<ImageView...app:srcCompat="@drawable/...を使用することをお勧めします

0