Android Studio项目手机运行崩溃求助:NoSuchMethodError异常
Hey there, I see you're new to programming and ran into a crash with your Android app—let's fix this together!
问题根源
从你的Logcat错误信息来看,核心问题是:
java.lang.NoSuchMethodError: No static method getFont(Landroid/content/Context;ILandroid/util/TypedValue;ILandroid/widget/TextView;)Landroid/graphics/Typeface; in class Landroid/support/v4/content/res/ResourcesCompat;
这几乎总是因为Android Support库版本不匹配导致的——不同模块的support库(比如appcompat-v7、support-v4)版本不一致,或者混合使用了Support库和AndroidX库,造成方法签名不兼容。
解决方案步骤
1. 统一Support库版本
打开你项目的build.gradle (Module level)文件,找到所有以com.android.support开头的依赖,确保它们的版本号完全一致。比如全部改成同一个稳定版本(比如28.0.0,这是Support库的最后一个正式版本):
// 示例依赖配置,根据你实际用到的库调整 implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support:support-v4:28.0.0' implementation 'com.android.support:design:28.0.0'
2. 清理并重建项目
Android Studio的缓存有时候会残留旧的库文件,导致冲突:
- 点击顶部菜单栏的
Build > Clean Project - 完成后再点击
Build > Rebuild Project
3. 检查是否混合使用Support和AndroidX库
如果你项目中同时存在com.android.support和androidx.*开头的依赖,会引发严重的兼容性问题。解决办法是:
- 要么全部迁移到AndroidX:使用Android Studio的
Refactor > Migrate to AndroidX功能,它会自动帮你替换所有依赖和代码引用 - 要么移除所有AndroidX依赖,保持全用Support库
4. 检查Toolbar布局配置
有时候布局文件中Toolbar的字体设置也可能触发这个问题。打开你的activity_main.xml,确保Toolbar没有引用不存在的字体资源,比如避免这类可能有问题的配置(除非你确认字体资源存在):
<android.support.v7.widget.Toolbar ... app:titleTextAppearance="@style/CustomToolbarText" />
你的代码和错误信息参考
Logcat错误信息
01-06 13:18:20.778 13471-13471/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.hof_university.chethan.chatmessenger, PID: 13471 java.lang.NoSuchMethodError: No static method getFont(Landroid/content/Context;ILandroid/util/TypedValue;ILandroid/widget/TextView;)Landroid/graphics/Typeface; in class Landroid/support/v4/content/res/ResourcesCompat; or its super classes (declaration of 'android.support.v4.content.res.ResourcesCompat' appears in /data/app/com.hof_university.chethan.chatmessenger-2/split_lib_dependencies_apk.apk) at android.support.v7.widget.TintTypedArray.getFont(TintTypedArray.java:119) at android.support.v7.widget.AppCompatTextHelper.updateTypefaceAndStyle(AppCompatTextHelper.java:208) at android.support.v7.widget.AppCompatTextHelper.loadFromAttributes(AppCompatTextHelper.java:110) at android.support.v7.widget.AppCompatTextHelperV17.loadFromAttributes(AppCompatTextHelperV17.java:38) at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:81) at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:71) at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:67) at android.support.v7.widget.Toolbar.setTitle(Toolbar.java:753) at android.support.v7.widget.ToolbarWidgetWrapper.setTitleInt(ToolbarWidgetWrapper.java:261) at android.support.v7.widget.ToolbarWidgetWrapper.setWindowTitle(ToolbarWidgetWrapper.java:243) at android.support.v7.widget.ActionBarOverlayLayout.setWindowTitle(ActionBarOverlayLayout.java:621) at android.support.v7.app.AppCompatDelegateImplV9.onTitleChanged(AppCompatDelegateImplV9.java:631) at android.support.v7.app.AppCompatDelegateImplV9.ensureSubDecor(AppCompatDelegateImplV9.java:328) at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:284) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139) at com.hof_university.chethan.chatmessenger.MainActivity.onCreate(MainActivity.java:19) at android.app.Activity.performCreate(Activity.java:6177) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2541) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685) at android.app.ActivityThread.access$900(ActivityThread.java:188) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1530) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:210) at android.app.ActivityThread.main(ActivityThread.java:5839) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1113) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:879)
MainActivity代码
public class MainActivity extends AppCompatActivity { private EditText editMessage; private DatabaseReference mDatabase; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editMessage = (EditText) findViewById(R.id.editMessageE); mDatabase = FirebaseDatabase.getInstance().getReference().child("Messages"); } public void sendButtonClicked(View view){ final String messageValue = editMessage.getText().toString().trim(); if (!TextUtils.isEmpty(messageValue)){ final DatabaseReference newPost = mDatabase.push(); newPost.child("content").setValue(messageValue); } } }
内容的提问来源于stack exchange,提问作者Chetan

