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

时间:2020-05-17 10:05:45

标签: android androidx

我迁移到AndroidX(使用Android Studio中的向导),并且共享操作提供程序遇到问题。向导在我的app:actionProviderClass="android.support.v7.widget.ShareActionProvider"文件中将app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"更改为detailactivity.xml(除其他外)。

只要我通过USB将其安装在我的设备上,该应用程序就可以正常编译和运行。但是,如果我编译一个已签名的APK,然后安装它,则会收到以下运行时错误(启动detailfragment时):

W / SupportMenuInflater:无法实例化类:androidx.appcompat.widget.ShareActionProvider

开发过程中我没有注意到此问题,因为我通过USB在设备上运行/测试了该应用程序。但是,当我现在测试(签名/缩小的)APK时,“共享”按钮不起作用。如何解决并解决此问题?例如,为什么它在签名/缩小的APK失败时会失败,而通过USB在同一设备上安装却能正常工作?

由于APK中的代码已最小化,因此很难明确指出警告在何处发生(在代码中)。也许我可以创建一个代码,使代码 not 最小化,以便我能正确引用源代码中的行(在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());
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我在#android-dev(IRC)上获得了一些帮助,看来问题是压缩器(由于某种原因)删除了androidx.appcompat.widget.ShareActionProvider类。关闭缩小功能会产生有效的APK。

解决方法是用新的“ keep”行更新我的proguard-rules.pro文件,以防止其删除该类。从以前开始,我对旧的Android支持库有类似的规则,因此我在下面添加了第二行,现在可以使用了。

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

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

感谢@melatonina!