gpt4 book ai didi

android-studio - 在膨胀过程中,膨胀 TextView 在方法 addFontWeightStyle() 上抛出 noSuchMethodException

转载 作者:行者123 更新时间:2023-12-03 15:58:52 26 4
gpt4 key购买 nike

更新:我已经更改了标题以删除 ExoPlayer 与正在发生的事情有任何关系的迹象,因为我已经设法在没有使用它的情况下复制了它。

我决定尝试在 API 级别隔离此错误:

我获得了一台运行 Android 7.0 (Api 24) 的较旧的三星平板电脑 (Tab S2),并且那里没有发生错误。

我无法使用 API 25 在 Nexus 6 模拟器上复制这个问题

我还尝试了运行 Android 8.0.0 (Api 26) 的较新三星平板电脑 (Tab S3),与三星 S7 Edge 手机的版本相同。我得到了同样的错误。

然后我创建了一个运行 Api 26(Oreo 8.0.0)的新模拟器(Pixel 2 XL)并运行该软件并得到相同的错误。

然后我创建了一个运行 Api 27 (Oreo 8.1) 的新模拟器 (Pixel XL) 并运行该软件并得到相同的错误。

试图在 Android 9 上验证这一点失去了挫败感 - 下载包时出错,谷歌搜索发现许多人必须以管理员身份运行才能解决这个问题,这样做,将下载复制到我的 SDK 位置使用我的正常登录,在我的正常登录下重新启动 Android,根据 Studio 的提示修补 SDK,并使用 9 定义了一个模拟器。得到了同样的错误。

有趣的是,在使用 Pie 的堆栈跟踪中,我得到了一个不同的行号,用于说明 TypefaceCompat 中失败发生的位置——这次是第 47 行,至少在相关类 (TypefaceCompatApi28Impl) 的实例化上。但是,堆栈跟踪仍然显示 Api21Impl 抛出错误。检查 Api28Impl 向我显示它扩展了 Api26Impl,它扩展了 Api21Impl。所以看起来这只是标签没有正确报告的问题。 Api21Impl 是基类,所以这就是要报告的内容。

它仍然没有解释为什么会发生错误,也没有解释如何处理。

因此,至少从这次有限的测试中可以看出,Oreo 8.0 引入了一些问题,此后的所有 SDK 中也存在这些问题。

该怎么办?

更新:其他一些奇怪的事情 - 我的三星是 API 26 (8.0.0),但下面的堆栈跟踪显示 Android 正在尝试利用 TypefaceCompatApi21Impl:

at androidx.core.graphics.TypefaceCompatApi21Impl.<clinit>(TypefaceCompatApi21Impl.java:74)
TypefaceCompatApi21Impl中的那行代码看起来像这样:
        try {
fontFamilyClass = Class.forName(FONT_FAMILY_CLASS);
fontFamilyCtor = fontFamilyClass.getConstructor();
error here---> addFontMethod = fontFamilyClass.getMethod(ADD_FONT_WEIGHT_STYLE_METHOD,
String.class, Integer.TYPE, Boolean.TYPE);

奇怪的是,在堆栈跟踪的更深处,我们看到 *Impl 类是如何初始化的:
AppCompatTextView.setTypeface()方法被调用(第 576 行)
这反过来会导致创建字体:
finalTypeface = TypefaceCompat.create(getContext(), tf, style);

当调用静态方法 create() 时,这又会导致运行静态初始化程序:
public class TypefaceCompat {
private static final TypefaceCompatBaseImpl sTypefaceCompatImpl;
static {
if (Build.VERSION.SDK_INT >= 28) {
sTypefaceCompatImpl = new TypefaceCompatApi28Impl();
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
sTypefaceCompatImpl = new TypefaceCompatApi26Impl();
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
&& TypefaceCompatApi24Impl.isUsable()) {
sTypefaceCompatImpl = new TypefaceCompatApi24Impl();
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
sTypefaceCompatImpl = new TypefaceCompatApi21Impl();
} else {
sTypefaceCompatImpl = new TypefaceCompatBaseImpl();
}
}

堆栈跟踪中的这一行:
at androidx.core.graphics.TypefaceCompat.<clinit>(TypefaceCompat.java:49)

实际上是初始化 TypefaceCompatApi26Impl() 的行,这表明 TypefaceCompatApi26Impl应该使用(考虑到我的三星硬件的 API 级别,这是有道理的),但堆栈跟踪显示 TypefaceCompatApi21Impl()抛出错误!

这怎么可能?

这里的另一个线索是静态初始化程序只运行一次。因为我只有在启动细节布局后才得到这个(但在此之前还有其他布局也有 TextView 组件),所以必须有一些与此布局相关的东西在某种程度上有所不同。以下是布局中的前几个组件(直到 TextView 组件的第一个定义):
<?xml version="1.0" encoding="utf-8"?>
<!-- This layout is used by PlaylistDetailFragment -->
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/item_listitem_constraint_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">

<!-- Layout related to Playlist 'Header' -->
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintGuide_percent="0.25"
android:orientation="vertical" />

<androidx.constraintlayout.widget.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintGuide_percent="0.80"
android:orientation="vertical" />

<androidx.constraintlayout.widget.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintGuide_percent="0.90"
android:orientation="vertical" />

<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/item_list_content_image"
android:layout_width="0dp"
android:layout_height="0dp"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:layout_marginStart="16dp"
android:layout_marginTop="4dp"
android:background="?android:attr/selectableItemBackground"
android:src="@drawable/playlist"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/guideline1"
app:layout_constraintBottom_toBottomOf="@+id/playlist_detail_description"/>

<TextView
android:id="@+id/playlist_detail_list_content_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="end"
android:text="@string/playlist_title_label"
android:textAppearance="@android:style/TextAppearance.Material.Small"
app:layout_constraintTop_toTopOf="@+id/playlist_detail_title"
app:layout_constraintBottom_toBottomOf="@+id/playlist_detail_title"
app:layout_constraintRight_toRightOf="@+id/playlist_detail_list_content_description"/>

我想也许是 android:textAppearance="@android:style/TextAppearance.Material.Small"由于某种原因,TextView 定义中的行导致了问题,但删除它没有任何效果 - 发生了同样的错误。

19 年 2 月 15 日更新:这又发生了,这次是在以前没有发生过的同一台三星设备上,完全不同的布局根本不使用 ExoPlayer,实际上只使用股票小部件。在下面的堆栈跟踪中,这一行:
at com.reddragon.cloudframe.PlaylistDetailFragment.onCreateView(PlaylistDetailFragment.java:309)

是我膨胀布局的地方:
final View rootView = inflater.inflate(R.layout.playlist_detail, container, false);

布局包括非常标准的项目(TextView、RecyclerView、Guidelines)等。这是完整的堆栈跟踪:
2019-02-15 06:31:12.287 10895-10895/com.reddragon.cloudframe E/TypefaceCompatApi21Impl: java.lang.NoSuchMethodException
java.lang.NoSuchMethodException: addFontWeightStyle [class java.lang.String, int, boolean]
at java.lang.Class.getMethod(Class.java:2068)
at java.lang.Class.getMethod(Class.java:1690)
at androidx.core.graphics.TypefaceCompatApi21Impl.<clinit>(TypefaceCompatApi21Impl.java:74)
at androidx.core.graphics.TypefaceCompat.<clinit>(TypefaceCompat.java:49)
at androidx.core.graphics.TypefaceCompat.create(TypefaceCompat.java:190)
at androidx.appcompat.widget.AppCompatTextView.setTypeface(AppCompatTextView.java:576)
at androidx.appcompat.widget.AppCompatTextHelper.loadFromAttributes(AppCompatTextHelper.java:217)
at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:103)
at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:93)
at androidx.appcompat.app.AppCompatViewInflater.createTextView(AppCompatViewInflater.java:182)
at androidx.appcompat.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:103)
at androidx.appcompat.app.AppCompatDelegateImpl.createView(AppCompatDelegateImpl.java:1267)
at androidx.appcompat.app.AppCompatDelegateImpl.onCreateView(AppCompatDelegateImpl.java:1317)
at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:189)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:772)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at com.reddragon.cloudframe.PlaylistDetailFragment.onCreateView(PlaylistDetailFragment.java:309)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2530)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:887)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1233)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1299)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:688)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2069)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1859)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1814)
at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManagerImpl.java:1691)
at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:537)
at androidx.fragment.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:170)
at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622)
at android.view.View.measure(View.java:23297)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6928)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:733)
at com.google.android.material.appbar.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:95)
at com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1556)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:803)
at android.view.View.measure(View.java:23297)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6928)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)

有什么想法吗?这很奇怪,也很令人沮丧!

它似乎在它尝试膨胀的第一个 TextView 上失败,但我无法弄清楚为什么会发生此错误。我在这个应用程序的其他布局中使用了相同的 TextView 小部件,它们膨胀得很好!

19 年 2 月 13 日更新:当我搜索类似问题时,我发现 this post .因为它提到了模拟器与物理上的不同行为,所以我在物理设备(三星 7 Edge、Android 8.0.0)上测试了我的问题,瞧——没问题。

编辑 2/16/19 - 但现在看到这篇文章顶部的评论。我不知道为什么它没有发生在我在 2/13 在这里描述的初始测试中,但问题是在运行 API 26 的三星 7 Edge 上“返回”。

我删除了以前的模拟器(Nexus 5,API 27),并创建了一个新的模拟器(Nexus 6,API 25)并且....没有错误!奇怪,但不知何故,我想模拟器会感到困惑......仍然会很好地了解如何更快地解决这些问题。

==================================

我一直在使用最新的 Exoplayer (2.9.5) 开发一个应用程序 (MediaPlayerActivity),并且最近在尝试增加股票 View 时开始出现错误:
2019-02-12 21:36:43.339 25761-25761/E/TypefaceCompatApi21Impl: java.lang.NoSuchMethodException
java.lang.NoSuchMethodException: addFontWeightStyle [class java.lang.String, int, boolean]
at java.lang.Class.getMethod(Class.java:2068)
at java.lang.Class.getMethod(Class.java:1690)
at androidx.core.graphics.TypefaceCompatApi21Impl.<clinit>(TypefaceCompatApi21Impl.java:74)
at androidx.core.graphics.TypefaceCompat.<clinit>(TypefaceCompat.java:49)
at androidx.core.graphics.TypefaceCompat.create(TypefaceCompat.java:190)
at androidx.appcompat.widget.AppCompatTextView.setTypeface(AppCompatTextView.java:576)
at androidx.appcompat.widget.AppCompatTextHelper.loadFromAttributes(AppCompatTextHelper.java:217)
at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:103)
at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:93)
at androidx.appcompat.app.AppCompatViewInflater.createTextView(AppCompatViewInflater.java:182)
at androidx.appcompat.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:103)
at androidx.appcompat.app.AppCompatDelegateImpl.createView(AppCompatDelegateImpl.java:1267)
at androidx.appcompat.app.AppCompatDelegateImpl.onCreateView(AppCompatDelegateImpl.java:1317)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:772)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:995)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:859)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at com.google.android.exoplayer2.ui.PlayerControlView.<init>(PlayerControlView.java:296)
at com.google.android.exoplayer2.ui.PlayerView.<init>(PlayerView.java:452)
at com.google.android.exoplayer2.ui.PlayerView.<init>(PlayerView.java:304)
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
at android.view.LayoutInflater.createView(LayoutInflater.java:647)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at MediaPlayerActivity$MediaPagerAdapter.instantiateItem(MediaPlayerActivity.java:676)

我正在使用标准库存 ExoPlayer View - 没有自定义:

pager_video_item.xml 中的布局:
<!-- Video Player  -->
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"/>

错误开始的代码,位于 PagerAdapter 实例中:
        case Media.MEDIA_TYPE_VIDEO:
itemView = mLayoutInflater.inflate(R.layout.pager_video_item, container, false);
mLayoutInflater在 PagerAdapter 构造函数中初始化:
class MediaPagerAdapter extends PagerAdapter {

final Context mContext;
final LayoutInflater mLayoutInflater;

MediaPagerAdapter(Context context) {
mContext = context;
mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

传递的上下文来自我的 MediaPlayerActivity类,扩展 androidx.appcompat.app.AppCompatActivity ( CFViewPager 扩展了 ViewPager ,只是添加了一些逻辑来适本地处理分派(dispatch)触摸事件。):
mViewPagerView = findViewById(R.id.activity_media_player_viewpager);
((CFViewPager) mViewPagerView).setAdapter(new MediaPagerAdapter(this));

我可以在我的同一台机器上构建和运行 ExoPlayer 演示,它可以工作。很明显,我在我的应用程序中更改了一些混淆运行时的设置。同样,这在几天前曾经完美地工作过。

我已经倾注了版本控制差异,但看不到我介绍的任何可能导致这种行为的内容。

从堆栈跟踪来看,尝试在 PlayerControlView 中扩充 TextView 时似乎失败了。但我不知道如何排除故障。

什么会导致运行时“突然”认为它不能使用反射来找到 TypefaceCompatApi21Impl.java 中的 addFontWeightStyle() 方法?

Android Studio 是最新的稳定版本 (3.3.1)
我相信我的 gradle 文件是最新的:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

compileSdkVersion 28
defaultConfig {
applicationId "mycoolapp.com"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"

构建工具设置为 28.0.3

我已经使缓存失效并重新启动、重建等。

感谢您对在哪里寻找故障排除的任何想法。

最佳答案

这是一个已经报告给 Android 团队的错误,并且似乎是为 future 版本准备好的修复程序:

https://issuetracker.google.com/issues/124274577

我猜他们指的是 AndroidX 库的 future 版本。

关于android-studio - 在膨胀过程中,膨胀 TextView 在方法 addFontWeightStyle() 上抛出 noSuchMethodException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54662843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com