迁移到AndroidX后:无法实例化类:androidx.appcompat.widget.ShareActionProvider。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迁移到AndroidX后:无法实例化类:androidx.appcompat.widget.ShareActionProvider。相关的知识,希望对你有一定的参考价值。

我迁移到了androidX(使用Android Studio中的向导),我在共享动作提供者方面遇到了问题。向导改变了(除其他外)。app:actionProviderClass="android.support.v7.widget.ShareActionProvider"app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"在我看来 detailactivity.xml 文件。

这个应用编译得很好,运行得也很好--只要我通过USB安装在我的设备上。然而,如果我编译一个签名的APK,并安装它,我得到以下运行时错误(当启动详细片段时)。

WSupportMenuInflater: 不能实例化类:androidx.appcompat.widget.ShareActionProvider。

我在开发的时候没有注意到这个问题,因为我是通过USB在我的设备上运行应用的。然而,当我现在测试(signedminified)APK时,分享按钮不工作。我该如何解决这个问题呢?比如说,为什么在signedminified APK失败,而通过USB在同一设备上安装时却能正常工作?

因为APK中的代码是经过minified的,所以很难说清楚警告发生在哪里(代码中)。也许我可以创建一个APK,其中的代码是 minified,这样我就能在源代码中得到正确的引用行(在Android Studio LogCat中)?

作为参考,这里是发生警告的类的摘录。我假设警告发生在这里的某个地方,因为这是引用shareActionProvider的地方?

import androidx.appcompat.widget.ShareActionProvider;

public class ScreenSlidePageFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {

    private ShareActionProvider mShareActionProvider;

    public ScreenSlidePageFragment() {
        setHasOptionsMenu(true); // only the share button
    }


    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.detailfragment, menu);
        MenuItem menuItem = menu.findItem(R.id.action_share);
        mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItem);

        if (mShareActionProvider != null && mImageData != null) {
            mShareActionProvider.setShareIntent(createShareImageIntent());
        }
    }
}
答案

我在#android-dev(IRC)上得到了一些帮助,似乎问题在于minifier(出于某种原因)删除了 "android......"。androidx.appcompat.widget.ShareActionProvider 类。关闭minification产生了一个工作的APK。

修复方法是更新我的 proguard-rules.pro 文件中加入新的 "keep "行,以防止它删除该类。从前,我对老的Android支持库也有类似的规则,所以我加了下面第二行,现在可以用了。

-keep class android.support.v7.widget.** { *; }

-keep class androidx.appcompat.widget.** { *; }

谢谢@melatonina!

以上是关于迁移到AndroidX后:无法实例化类:androidx.appcompat.widget.ShareActionProvider。的主要内容,如果未能解决你的问题,请参考以下文章

迁移到 Androidx 后无法解析符号 R

无法解析 android.support.design。迁移到 AndroidX 后

如何修复颤振的 AndroidX 不兼容问题?

迁移到 AndroidX 时无法解析变量“$animal.sniffer.version”

无法将 Flutter 项目迁移到 AndroidX

在迁移到 viewpager2 androidx 时发现此错误“无法解析方法 'super(androidx.fragment.app.FragmentManager)'”