以前の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は表示されません。
問題は、私のアクティビティがAppCompatActivity
ではなく、通常のActivity
を拡張していることでした。
これはサポートベクタードロウアブルのドキュメント/例では指定されていません
このコードは、使用している場合、ベクターで動作します
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"/>
私も同様の問題に直面しましたが、@ 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にアップグレードせずに行われ、別の問題に対処しました。
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);
...
ここで与えられる答えは、同じエラーを与えるため、テキストビューにドロアブルを追加したい状況を無視しています。私の場合、私は持っていた
<TextView .... Android:drawableLeft="some_vectore_drawable" />
私はこれを解決する方法を見つけることができなかったので、その行をxmlコードから削除して、この方法でJavaコードに入れました
Drawable somevectordrable = AppCompatDrawableManager.get().getDrawable(context, R.drawable.somevectordrawable);
mytextview.setCompoundDrawableWithIntrinsicBounds(somevectordrable, null, null, null);
コードの明確化、
AppCompatDrawableManagerを使用して、drawablesフォルダーからベクトルdrawableを取得します
テキストビューの左側のドロアブルとして取得したドロアブルを設定します
新しいベクターサポートライブラリも含める必要があります。
compile 'com.Android.support:support-vector-drawable:23.2.0'
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
インターネットで好きなのはそれだけです。あなたが見逃しているものをチェックしてください。
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);
....
}
}
drawableLeft
、drawableRight
、drawableTop
、drawableXxx
などでこの例外の問題がある場合...そしてプロジェクト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より大きい
これは、API 19に表示されるsupport-v4、appcompat-v7ライブラリv23.2.0のバグです。@ timは、このバグの問題へのリンクを提供します。
新しいライブラリバージョン23.2.1にアップグレードでき、バグが修正されました。
drawableLeft
/drawableStart
などでこの問題が発生している場合、データバインディングを使用している場合、簡単な解決策があります。
の代わりに:
Android:drawableLeft="@drawable/somevector" ❌
行う:
Android:drawableLeft="@{@drawable/somevector}" ✅
これは、データバインディングが互換性のある方法でドロウアブルを取得するコードをコンパイル時に生成するためです。
Code.googleでこの問題を見つけました。
それはあなたと同じ問題のようです。これは役立ちますか? https://code.google.com/p/Android/issues/detail?id=20184
ベクトルドロアブルをロードするときに<Android.support.v7.widget.AppCompatImageView
を使用している場合は、AppCompatActivity
の代わりにActivity
を拡張し、通常の<ImageView...app:srcCompat="@drawable/...
を使用することをお勧めします