android - 自定义 View 上的可绘制标签向量无效

标签 android android-vectordrawable

我创建了一个带有图像图标的自定义 View ,并像这样初始化它:

XML

IconFieldLinearLayout.java

private void initAttr(Context context, AttributeSet attrs) {

        if (attrs != null) {
            TypedArray a = context.obtainStyledAttributes(attrs,
                    R.styleable.IconFieldLinearLayout, 0, 0);



            Drawable icon = a.getDrawable(R.styleable.IconFieldLinearLayout_icon);
            boolean tintIcon = a.getBoolean(R.styleable.IconFieldLinearLayout_tintIcon, true);
            int color = a.getColor(R.styleable.IconFieldLinearLayout_tintColor, Color.WHITE);

            a.recycle();
            initIcon(context, icon, tintIcon, color);
        } else {
            initIcon(context, mDefaultDrawable, true, Color.WHITE);
        }
    }

当我在 Android 4.3 上运行这个 drawable 时:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="#ffff"
        android:pathData="M12,5.9c1.16,0 2.1,0.94 2.1,2.1s-0.94,2.1 -2.1,2.1S9.9,9.16 9.9,8s0.94,-2.1 2.1,-2.1m0,9c2.97,0 6.1,1.46 6.1,2.1v1.1L5.9,18.1L5.9,17c0,-0.64 3.13,-2.1 6.1,-2.1M12,4C9.79,4 8,5.79 8,8s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM12,13c-2.67,0 -8,1.34 -8,4v3h16v-3c0,-2.66 -5.33,-4 -8,-4z"/>
</vector>

我得到:

android.view.InflateException: Binary XML file line #0: Error inflating class tv.myapp.ui.iconfield.IconFieldLinearLayout
                                                                                   at android.view.LayoutInflater.createView(LayoutInflater.java:669)
                                                                                   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:745)
                                                                                   at android.view.LayoutInflater.rInflate(LayoutInflater.java:804)
                                                                                   at android.view.LayoutInflater.rInflate(LayoutInflater.java:812)
                                                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:526)
                                                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
                                                                                   at tv.myapp.base.view.BaseMosbyFragment.onCreateView(BaseMosbyFragment.java:34)
                                                                                   at android.support.v4.app.Fragment.performCreateView(Fragment.java:2192)
                                                                                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299)
                                                                                   at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
                                                                                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
                                                                                   at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758)
                                                                                   at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363)
                                                                                   at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149)
                                                                                   at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103)
                                                                                   at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1984)
                                                                                   at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:626)
                                                                                   at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:166)
                                                                                   at android.support.v4.view.ViewPager.populate(ViewPager.java:1268)
                                                                                   at android.support.v4.view.ViewPager.populate(ViewPager.java:1116)
                                                                                   at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:540)
                                                                                   at tv.myapp.login.LoginActivity$1.lambda$setResource$1$LoginActivity$1(LoginActivity.java:70)
                                                                                   at tv.myapp.login.LoginActivity$1$$Lambda$1.run(Unknown Source)
                                                                                   at android.os.Handler.handleCallback(Handler.java:730)
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:92)
                                                                                   at android.os.Looper.loop(Looper.java:177)
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5493)
                                                                                   at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                   at java.lang.reflect.Method.invoke(Method.java:525)
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1225)
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1041)
                                                                                   at dalvik.system.NativeStart.main(Native Method)
                                                                                Caused by: java.lang.reflect.InvocationTargetException
                                                                                   at java.lang.reflect.Constructor.constructNative(Native Method)
                                                                                   at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
                                                                                   at android.view.LayoutInflater.createView(LayoutInflater.java:643)
                                                                                   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:745) 
                                                                                   at android.view.LayoutInflater.rInflate(LayoutInflater.java:804) 
                                                                                   at android.view.LayoutInflater.rInflate(LayoutInflater.java:812) 
                                                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:526) 
                                                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:426) 
                                                                                   at tv.myapp.base.view.BaseMosbyFragment.onCreateView(BaseMosbyFragment.java:34) 
                                                                                   at android.support.v4.app.Fragment.performCreateView(Fragment.java:2192) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595) 
                                                                                   at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1984) 
                                                                                   at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:626) 
                                                                                   at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:166) 
                                                                                   at android.support.v4.view.ViewPager.populate(ViewPager.java:1268) 
                                                                                   at android.support.v4.view.ViewPager.populate(ViewPager.java:1116) 
                                                                                   at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:540) 
                                                                                   at tv.myapp.login.LoginActivity$1.lambda$setResource$1$LoginActivity$1(LoginActivity.java:70) 
                                                                                   at tv.myapp.login.LoginActivity$1$$Lambda$1.run(Unknown Source) 
                                                                                   at android.os.Handler.handleCallback(Handler.java:730) 
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:92) 
                                                                                   at android.os.Looper.loop(Looper.java:177) 
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5493) 
                                                                                   at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                                   at java.lang.reflect.Method.invoke(Method.java:525) 
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1225) 
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1041) 
                                                                                   at dalvik.system.NativeStart.main(Native Method) 
                                                                                Caused by: android.content.res.Resources$NotFoundException: File res/drawable/ic_person_outline.xml from drawable resource ID #0x7f0800db
                                                                                   at android.content.res.Resources.loadDrawable(Resources.java:2974)
                                                                                   at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
                                                                                   at tv.myapp.ui.iconfield.IconFieldLinearLayout.initAttr(IconFieldLinearLayout.java:59)
                                                                                   at tv.myapp.ui.iconfield.IconFieldLinearLayout.init(IconFieldLinearLayout.java:51)
                                                                                   at tv.myapp.ui.iconfield.IconFieldLinearLayout.<init>(IconFieldLinearLayout.java:34)
                                                                                   at java.lang.reflect.Constructor.constructNative(Native Method) 
                                                                                   at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
                                                                                   at android.view.LayoutInflater.createView(LayoutInflater.java:643) 
                                                                                   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:745) 
                                                                                   at android.view.LayoutInflater.rInflate(LayoutInflater.java:804) 
                                                                                   at android.view.LayoutInflater.rInflate(LayoutInflater.java:812) 
                                                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:526) 
                                                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:426) 
                                                                                   at tv.myapp.base.view.BaseMosbyFragment.onCreateView(BaseMosbyFragment.java:34) 
                                                                                   at android.support.v4.app.Fragment.performCreateView(Fragment.java:2192) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595) 
                                                                                   at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1984) 
                                                                                   at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:626) 
                                                                                   at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:166) 
                                                                                   at android.support.v4.view.ViewPager.populate(ViewPager.java:1268) 
                                                                                   at android.support.v4.view.ViewPager.populate(ViewPager.java:1116) 
                                                                                   at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:540) 
                                                                                   at tv.myapp.login.LoginActivity$1.lambda$setResource$1$LoginActivity$1(LoginActivity.java:70) 
                                                                                   at tv.myapp.login.LoginActivity$1$$Lambda$1.run(Unknown Source) 
                                                                                   at android.os.Handler.handleCallback(Handler.java:730) 
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:92) 
                                                                                   at android.os.Looper.loop(Looper.java:177) 
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5493) 
                                                                                   at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                                   at java.lang.reflect.Method.invoke(Method.java:525) 
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1225) 
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1041) 
                                                                                   at dalvik.system.NativeStart.main(Native Method) 
                                                                                Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #0: invalid drawable tag vector
                                                                                   at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:933)
                                                                                   at android.graphics.drawable.Drawable.createFromXml(Drawable.java:873)
                                                                                   at android.content.res.Resources.loadDrawable(Resources.java:2970)
                                                                                   at android.content.res.TypedArray.getDrawable(TypedArray.java:602) 
                                                                                   at tv.myapp.ui.iconfield.IconFieldLinearLayout.initAttr(IconFieldLinearLayout.java:59) 
                                                                                   at tv.myapp.ui.iconfield.IconFieldLinearLayout.init(IconFieldLinearLayout.java:51) 
                                                                                   at tv.myapp.ui.iconfield.IconFieldLinearLayout.<init>(IconFieldLinearLayout.java:34) 
                                                                                   at java.lang.reflect.Constructor.constructNative(Native Method) 
                                                                                   at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
                                                                                   at android.view.LayoutInflater.createView(LayoutInflater.java:643) 
                                                                                   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:745) 
                                                                                   at android.view.LayoutInflater.rInflate(LayoutInflater.java:804) 
                                                                                   at android.view.LayoutInflater.rInflate(LayoutInflater.java:812) 
                                                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:526) 
                                                                                   at android.view.LayoutInflater.inflate(LayoutInflater.java:426) 
                                                                                   at tv.myapp.base.view.BaseMosbyFragment.onCreateView(BaseMosbyFragment.java:34) 
                                                                                   at android.support.v4.app.Fragment.performCreateView(Fragment.java:2192) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595) 
                                                                                   at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103) 
                                                                                   at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1984) 
                                                                                   at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:626) 
                                                                                   at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:166) 
                                                                                   at android.support.v4.view.ViewPager.populate(ViewPager.java:1268) 
                                                                                   at android.support.v4.view.ViewPager.populate(ViewPager.java:1116) 
                                                                                   at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:540) 
                                                                                   at tv.myapp.login.LoginActivity$1.lambda$setResource$1$LoginActivity$1(LoginActivity.java:70) 
                                                                                   at tv.myapp.login.LoginActivity$1$$Lambda$1.run(Unknown Source) 
                                                                                   at android.os.Handler.handleCallback(Handler.java:730) 
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:92) 
                                                                                   at android.os.Looper.loop(Looper.java:177) 
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5493) 
                                                                                   at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                                   at java.lang.reflect.Method.invoke(Method.java:525) 
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1225) 
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1041) 
                                                                                   at dalvik.system.NativeStart.main(Native Method) 

我已将 vectorDrawables.useSupportLibrary = true 放在我的 gradle 文件中。

最佳答案

替换这一行:

Drawable icon = a.getDrawable(R.styleable.IconFieldLinearLayout_icon);

这些:

int iconId = a.getResourceId(R.styleable.IconFieldLinearLayout_icon, 0);
Drawable icon = AppCompatResources.getDrawable(context, iconId);

AppCompatResources类将使用 VectorDrawableCompat如果资源是 <vector>,则创建可绘制对象并且该平台已经足够老,不支持矢量绘图。

关于android - 自定义 View 上的可绘制标签向量无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47289765/

相关文章:

android - ioctl 返回 ENOENT 尝试将 URB 请求发布到 Isoc 设备端点(从 android 的 JNI 访问)

android - 我怎么知道是否是android :textColor has int or ColorStateList value

android - 如何通过AIDL传递SurfaceHolder?

android - 如何在 Android 上打开键盘时隐藏广告横幅

android - 如何将单选按钮居中对齐

android - VectorDrawable - 它是否可用于 Android 的 Lollipop 前版本?

android - 将 SVG 文件转换为 Android Vector Drawable XML,同时保持组结构就位

android - VectorDrawable 未居中对齐

android - DexGuard 和矢量绘图

android - 从矢量图中获取位图