41

app:srcCompatwith をImageView使用すると、ベクター型ドローアブルの下位互換性を利用できます。Viewしかし、 以外のでそれらをどのように使用できますImageViewか? たとえば、 のTextViewような属性ですandroid:drawableLeft

また、ベクトル ドローアブルをandroid:iconwithとして使用するMenuItemと、次の例外でクラッシュが発生しました。

Fatal Exception: android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
   at android.view.LayoutInflater.createView(LayoutInflater.java:626)
   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
   at android.view.LayoutInflater.inflate(LayoutInflater.java:470)
   at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
   at android.support.v7.view.menu.MenuItemImpl.setActionView(MenuItemImpl.java:621)
   at android.support.v7.view.menu.MenuItemImpl.setActionView(MenuItemImpl.java:40)
   at android.support.v4.view.MenuItemCompat.setActionView(MenuItemCompat.java:310)
   at android.support.v7.view.SupportMenuInflater$MenuState.setItem(SupportMenuInflater.java:465)
   at android.support.v7.view.SupportMenuInflater$MenuState.addItem(SupportMenuInflater.java:479)
   at android.support.v7.view.SupportMenuInflater.parseMenu(SupportMenuInflater.java:196)
   at android.support.v7.view.SupportMenuInflater.inflate(SupportMenuInflater.java:118)
   at com.example.niceapp.context.main.MainActivity.onCreateOptionsMenu(MainActivity.java:101)
   at android.app.Activity.onCreatePanelMenu(Activity.java:2578)

サポート ライブラリ 23.2.0 では、この問題にどのように対処できますか?

4

9 に答える 9

45

更新 2 : サポート ライブラリ 23.4.0 で再度有効にするオプションが追加されました。

AppCompat ユーザー向けに、オプトイン API を追加して、AppCompatDelegate.setCompatVectorFromResourcesEnabled()を介してリソースからベクタードローアブルのサポート (23.2 で見つかった動作) を再度有効にしました。構成インスタンスを更新しているため、デフォルトで無効になっています。

更新: これは、バージョン 23.3.0 以降では機能しなくなりました

AppCompat ユーザーの場合、バージョン 23.2.0/23.2.1 の実装で見つかった問題により、Lollipop 以前のデバイスのリソースからベクター ドローアブルを使用できるようにする機能を削除することを決定しました [ https://code.google. com/p/android/issues/detail?id=205236https://code.google.com/p/android/issues/detail?id=204708] . app:srcCompat と setImageResource() の使用は引き続き機能します。

Android Developers の Google+ 投稿から


AppCompat と app:srcCompat を使用することは、ベクター型ドローアブルをアプリに統合する最も簡単な方法です。

この引用は、サポート ライブラリのバージョン 23.2.0 のリリースに関する公式ブログ投稿からのものです。

この投稿では、次のことも言及しています。

app:srcCompatLollipop より前に、ベクトル型ドローアブルを外部で直接参照すると失敗することがわかります。ただし、、、 、 、などのAppCompat別のドローアブル コンテナーで参照されているベクター ドローアブルの読み込みはサポートされています。この間接化を使用することで、の属性など、通常はベクター型ドローアブルをサポートできない場合でも、ベクター型ドローアブルを使用できます。StateListDrawableInsetDrawableLayerDrawableLevelListDrawableRotateDrawableTextViewandroid:drawableLeft

これは、以下の手順に変換されます。

ステップ1:

アプリに必要なベクター リソースを作成またはインポートします。たとえば、検索アイコン用のベクター ドローアブルを作成し、名前を付けることができます。ic_action_search_vector.xml

ステップ2:

前に作成したベクター ドローアブル用に別のプロキシ ドローアブル リソースを作成します。たとえば、前の についてはic_action_search_vector.xml、以下の行を含むic_action_search.xml単純なものとして作成できます。StateListDrawable

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

ビューで使用する別のドローアブル リソースからベクター ドローアブルを参照している場合は、この手順をスキップできます。

ステップ 3:

ベクター型ドローアブル ( ) を直接参照する代わりに、ic_action_search.xmlベクター型ドローアブル ( ) を参照するドローアブル リソース (ここでは) を使用します。ic_action_search_vector.xmlメニューの場合、次のようになります。

<item android:id="@+id/search"
        android:title="@string/search"
        android:icon="@drawable/ic_action_search"
        app:showAsAction="always"/>

そんな悩みを解決するのがこれ!

于 2016-03-04T15:53:49.783 に答える
31

AppCompat バージョン 23.3.0 の場合、セレクター XML (razzledazzle の受け入れられた回答) を介した作業ソリューションはありません。プログラムでこれを行うことができます。

activity_main.xml

<android.support.v7.widget.AppCompatImageButton
    android:id="@+id/btnEnter"
    />

MainActivity.java

AppCompatImageButton image = (AppCompatImageButton) findViewById(R.id.btnEnter);
if (image != null) {
    VectorDrawableCompat vcAccept = VectorDrawableCompat.create(getResources(), R.drawable.vc_accept, getTheme());
    VectorDrawableCompat vcAcceptWhite = VectorDrawableCompat.create(getResources(), R.drawable.vc_accept_white, getTheme());

    StateListDrawable stateList = new StateListDrawable();
    stateList.addState(new int[]{android.R.attr.state_focused, -android.R.attr.state_pressed}, vcAccept);
    stateList.addState(new int[]{android.R.attr.state_focused, android.R.attr.state_pressed}, vcAcceptWhite);
    stateList.addState(new int[]{-android.R.attr.state_focused, android.R.attr.state_pressed}, vcAcceptWhite);
    stateList.addState(new int[]{}, vcAccept);

    image.setImageDrawable(stateList);
}

このコードは、このセレクター xml と同等です。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:state_pressed="false" android:drawable="@drawable/vc_accept" />
    <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/vc_accept_white" />
    <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/vc_accept_white" />
    <item android:drawable="@drawable/vc_accept" />
</selector>

アップデート

ベクター ドローアブルが API 23 を使用して表示されない場合は、最初VectorDrawableに を通常のドローアブルに変換する必要があります。Drawable使用したい場合setCompoundDrawablesWithIntrinsicBoundsはこれを行う必要がありますが、StateListDrawable の場合は必要ありませんでした。

Drawable icon;
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
    icon = VectorDrawableCompat.create(getResources(), R.drawable.vc_icon, getContext().getTheme());
} else {
    icon = getResources().getDrawable(R.drawable.vc_icon, getContext().getTheme());
}
于 2016-04-21T07:33:39.180 に答える
1

Form android studio 3.0.0 android:srcはベクター画像をサポートしておらず、21 未満では例外が発生します。ベクター画像にはapp:srcCompatを使用します。すべてのベクター画像ファイルをドローアブルフォルダー内に保持します。

android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }

そして、アプリケーションクラスでこれを定義します:

@Override
public void onCreate() {
    super.onCreate();
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

これで、.xml ファイルを使用できます。このリンクを使用することを忘れないでください: xmlns:app="http://schemas.android.com/apk/res-auto"

<RelativeLayout
    android:id="@+id/counterValuePanel"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/ic_cart_notify"/>
</RelativeLayout>

app:srcCompat="@drawable/ic_cart_notify" を使用できるようになりましたが、 android:background または android:drawableLeft で使用しようとすると、「Error inflating」例外が発生します。そのために、新しいラップされたドローアブル .xml ファイルを作成します。ic_cart_notifyはベクター アイコンです。

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_cart_notify"/>
</layer-list>
于 2017-12-31T04:54:56.310 に答える
1

Android 5.0 (API レベル 21) 以降では、ベクター ドローアブルがサポートされています。アプリの最小 API レベルがそれより低い場合、Vector Asset Studio はベクター ドローアブル ファイルをプロジェクトに追加します。また、ビルド時に、Gradle はさまざまな解像度で PNG ラスター イメージを作成します。Gradle は、build.gradle ファイルの Domain Specific Language (DSL) generatedDensities プロパティで指定された PNG 密度を生成します。PNG を生成するには、ビルド システムに Gradle 1.5.0 以降の Android プラグインが必要です。

Gradle vectorDrawables.useSupportLibrary = true に含める場合、これは当てはまりません

false に設定するか、行を完全に削除すると、すべてのベクトルがそのまま機能します。しかし、Android の古いバージョンでは、変換された PNG に依存することができます。

于 2016-09-07T14:49:26.300 に答える
0

大道 そうです。したがって、VectorDrawables でビューにセレクターを使用する場合は、次を追加する必要があります。

    static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(trfor);
}

Android 5 より前のバージョンのデバイスで VectorDrawables を使用するすべてのアクティビティに。

于 2018-01-09T12:24:02.737 に答える