365連休

にわかのandroidとかの開発メモ。

【解決】Android Studio 4.2 AppCompatTextViewのテキスト選択時にResources$NotFoundExceptionが発生する

2023/1/15追記

未検証だが、適切な依存関係の記述で解消する可能性がある。

当時、"依存関係の記述方法を見落としていたため例外が発生した"のかは不明。

developer.android.com

 

 

事象

AppCompatTextViewにsetTextIsSelectable(true)を適用する。

テキストを選択した瞬間にandroid.content.res.Resources.NotFoundExceptionが発生し、強制終了する。

 

 

前提

 

 

スタックトレース

E/AndroidRuntime: FATAL EXCEPTION: main
    android.content.res.Resources$NotFoundException: File res/drawable/abc_ic_menu_selectall_mtrl_alpha.xml from drawable resource ID #0x7f080024. If the resource you are trying to use is a vector resource, you may be referencing it in an unsupported way. See AppCompatDelegate.setCompatVectorFromResourcesEnabled() for more info.
        at android.content.res.Resources.loadDrawable(Resources.java:1923)
        at android.content.res.Resources.getDrawable(Resources.java:659)
        at com.android.internal.view.menu.MenuItemImpl.getIcon(MenuItemImpl.java:385)
        at com.android.internal.view.menu.ActionMenuItemView.initialize(ActionMenuItemView.java:89)
        at com.android.internal.view.menu.ActionMenuPresenter.bindItemView(ActionMenuPresenter.java:174)
        at com.android.internal.view.menu.BaseMenuPresenter.getItemView(BaseMenuPresenter.java:174)
        at com.android.internal.view.menu.ActionMenuPresenter.getItemView(ActionMenuPresenter.java:160)
        at com.android.internal.view.menu.ActionMenuPresenter.flagActionItems(ActionMenuPresenter.java:404)
        at com.android.internal.view.menu.MenuBuilder.flagActionItems(MenuBuilder.java:1055)
        at com.android.internal.view.menu.BaseMenuPresenter.updateMenuView(BaseMenuPresenter.java:87)
        at com.android.internal.view.menu.ActionMenuPresenter.updateMenuView(ActionMenuPresenter.java:188)
        at com.android.internal.view.menu.BaseMenuPresenter.getMenuView(BaseMenuPresenter.java:72)
        at com.android.internal.view.menu.ActionMenuPresenter.getMenuView(ActionMenuPresenter.java:148)
        at com.android.internal.widget.ActionBarContextView.initForMode(ActionBarContextView.java:230)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.startActionMode(PhoneWindow.java:2277)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.startActionModeForChild(PhoneWindow.java:2215)
        at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:619)
        at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:619)
        at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:619)
        at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:619)
        at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:619)
        at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:619)
        at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:619)
        at android.view.View.startActionMode(View.java:4182)
        at android.widget.Editor.startSelectionActionMode(Editor.java:1479)
        at android.widget.Editor.performLongClick(Editor.java:811)
        at android.widget.TextView.performLongClick(TextView.java:7880)
        at android.view.View$CheckForLongPress.run(View.java:16945)
        at android.os.Handler.handleCallback(Handler.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #21: invalid drawable tag vector
        at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:877)
        at android.graphics.drawable.Drawable.createFromXml(Drawable.java:818)
        at android.content.res.Resources.loadDrawable(Resources.java:1920)
        at android.content.res.Resources.getDrawable(Resources.java:659) 
        at com.android.internal.view.menu.MenuItemImpl.getIcon(MenuItemImpl.java:385) 
        at com.android.internal.view.menu.ActionMenuItemView.initialize(ActionMenuItemView.java:89) 
        at com.android.internal.view.menu.ActionMenuPresenter.bindItemView(ActionMenuPresenter.java:174) 
        at com.android.internal.view.menu.BaseMenuPresenter.getItemView(BaseMenuPresenter.java:174) 
        at com.android.internal.view.menu.ActionMenuPresenter.getItemView(ActionMenuPresenter.java:160) 
        at com.android.internal.view.menu.ActionMenuPresenter.flagActionItems(ActionMenuPresenter.java:404) 
        at com.android.internal.view.menu.MenuBuilder.flagActionItems(MenuBuilder.java:1055) 
        at com.android.internal.view.menu.BaseMenuPresenter.updateMenuView(BaseMenuPresenter.java:87) 
        at com.android.internal.view.menu.ActionMenuPresenter.updateMenuView(ActionMenuPresenter.java:188) 
        at com.android.internal.view.menu.BaseMenuPresenter.getMenuView(BaseMenuPresenter.java:72) 
        at com.android.internal.view.menu.ActionMenuPresenter.getMenuView(ActionMenuPresenter.java:148) 
        at com.android.internal.widget.ActionBarContextView.initForMode(ActionBarContextView.java:230) 
        at com.android.internal.policy.impl.PhoneWindow$DecorView.startActionMode(PhoneWindow.java:2277) 
        at com.android.internal.policy.impl.PhoneWindow$DecorView.startActionModeForChild(PhoneWindow.java:2215) 
        at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:619) 
        at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:619) 
        at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:619) 
        at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:619) 
        at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:619) 
        at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:619) 
        at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:619) 
        at android.view.View.startActionMode(View.java:4182) 
        at android.widget.Editor.startSelectionActionMode(Editor.java:1479) 
        at android.widget.Editor.performLongClick(Editor.java:811) 
        at android.widget.TextView.performLongClick(TextView.java:7880) 
        at android.view.View$CheckForLongPress.run(View.java:16945) 
        at android.os.Handler.handleCallback(Handler.java:615) 
        at android.os.Handler.dispatchMessage(Handler.java:92) 
        at android.os.Looper.loop(Looper.java:137) 
        at android.app.ActivityThread.main(ActivityThread.java:4745) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:511) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
        at dalvik.system.NativeStart.main(Native Method) 

 

 

調査

androidx.appcompat:appcompat:1.2.0 から 1.3.0への変更時にDrawableResourceがPNGからVectorに変更された。

developer.android.com

 

VectorDrawableはAndroid 4.4以下でサポートされていない。

 

neet-rookie.hatenablog.com

 

下位互換性のためのライブラリなのに、下位を切り捨てないで!!

 

 

積極的 解決法 2021/8/11追記

ApplicationまたはTopActivityにて、AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);をstaticコールする。

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

 

neet-rookie.hatenablog.com

 

 

 

消極的 解決法

androidx.appcompat:appcompat:1.3.0以降を使用しない。