Android The style on this component requires your app theme to be Theme.AppCompat

本文详细解析了一种常见的Android自定义View开发中遇到的问题,即因应用主题不匹配导致的 InflateException 错误。通过深入分析错误日志,指出了自定义View构造函数设置不当及主题配置错误是引发此问题的主要原因,并提供了具体的解决方案。

 

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.debugshow, PID: 3438
    java.lang.RuntimeException: Unable to start service com.example.debugshow.view.Main.FloatingService@ed88d6d with Intent { cmp=com.example.debugshow/.view.Main.FloatingService (has extras) }: android.view.InflateException: Binary XML file line #22: Binary XML file line #22: Error inflating class com.example.debugshow.view.Main.DraggableFloatingButton
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3097)
        at android.app.ActivityThread.access$2300(ActivityThread.java:156)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1507)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:157)
        at android.app.ActivityThread.main(ActivityThread.java:5653)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
     Caused by: android.view.InflateException: Binary XML file line #22: Binary XML file line #22: Error inflating class com.example.debugshow.view.Main.DraggableFloatingButton
        at android.view.LayoutInflater.inflate(LayoutInflater.java:543)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:427)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
        at android.view.View.inflate(View.java:19830)
        at com.example.debugshow.view.Main.FloatingDebugView.initView(FloatingDebugView.java:37)
        at com.example.debugshow.view.Main.FloatingDebugView.<init>(FloatingDebugView.java:31)
        at com.example.debugshow.view.Main.FloatingDebugWindowManager.addView(FloatingDebugWindowManager.java:52)
        at com.example.debugshow.view.Main.FloatingService.onStartCommand(FloatingService.java:41)
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3077)
        at android.app.ActivityThread.access$2300(ActivityThread.java:156) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1507) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:157) 
        at android.app.ActivityThread.main(ActivityThread.java:5653) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
     Caused by: android.view.InflateException: Binary XML file line #22: Error inflating class com.example.debugshow.view.Main.DraggableFloatingButton
        at android.view.LayoutInflater.createView(LayoutInflater.java:649)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:768)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:708)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:839)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:802)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:842)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:802)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:519)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:427) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
        at android.view.View.inflate(View.java:19830) 
        at com.example.debugshow.view.Main.FloatingDebugView.initView(FloatingDebugView.java:37) 
        at com.example.debugshow.view.Main.FloatingDebugView.<init>(FloatingDebugView.java:31) 
        at com.example.debugshow.view.Main.FloatingDebugWindowManager.addView(FloatingDebugWindowManager.java:52) 
        at com.example.debugshow.view.Main.FloatingService.onStartCommand(FloatingService.java:41) 
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3077) 
        at android.app.ActivityThread.access$2300(ActivityThread.java:156) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1507) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:157) 
        at android.app.ActivityThread.main(ActivityThread.java:5653) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance(Native Method)
        at android.view.LayoutInflater.createView(LayoutInflater.java:623)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:768) 
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:708) 
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:839) 
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:802) 
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:842) 
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:802) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:519) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:427) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
        at android.view.View.inflate(View.java:19830) 
        at com.example.debugshow.view.Main.FloatingDebugView.initView(FloatingDebugView.java:37) 
        at com.example.debugshow.view.Main.FloatingDebugView.<init>(FloatingDebugView.java:31) 
        at com.example.debugshow.view.Main.FloatingDebugWindowManager.addView(FloatingDebugWindowManager.java:52) 
        at com.example.debugshow.view.Main.FloatingService.onStartCommand(FloatingService.java:41) 
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3077) 
        at android.app.ActivityThread.access$2300(ActivityThread.java:156) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1507) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:157) 
        at android.app.ActivityThread.main(ActivityThread.java:5653) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
     Caused by: java.lang.IllegalArgumentException: The style on this component requires your app theme to be Theme.AppCompat (or a descendant).
        at android.support.design.internal.ThemeEnforcement.checkTheme(ThemeEnforcement.java:221)
        at android.support.design.internal.ThemeEnforcement.checkAppCompatTheme(ThemeEnforcement.java:196)
        at android.support.design.internal.ThemeEnforcement.checkCompatibleTheme(ThemeEnforcement.java:131)
        at android.support.design.internal.ThemeEnforcement.obtainStyledAttributes(ThemeEnforcement.java:72)
        at android.support.design.widget.FloatingActionButton.<init>(FloatingActionButton.java:195)
        at android.support.design.widget.FloatingActionButton.<init>(FloatingActionButton.java:188)
        at com.example.debugshow.view.Main.DraggableFloatingButton.<init>(DraggableFloatingButton.java:24)
        at java.lang.reflect.Constructor.newInstance(Native Method) 
        at android.view.LayoutInflater.createView(LayoutInflater.java:623) 
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:768) 
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:708) 
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:839) 
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:802) 
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:842) 
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:802) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:519) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:427) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
        at android.view.View.inflate(View.java:19830) 
        at com.example.debugshow.view.Main.FloatingDebugView.initView(FloatingDebugView.java:37) 
        at com.example.debugshow.view.Main.FloatingDebugView.<init>(FloatingDebugView.java:31) 
        at com.example.debugshow.view.Main.FloatingDebugWindowManager.addView(FloatingDebugWindowManager.java:52) 
        at com.example.debugshow.view.Main.FloatingService.onStartCommand(FloatingService.java:41) 
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3077) 
        at android.app.ActivityThread.access$2300(ActivityThread.java:156) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1507) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:157) 
        at android.app.ActivityThread.main(ActivityThread.java:5653) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
I/Process: Sending signal. PID: 3438 SIG: 9
Disconnected from the target VM, address: 'localhost:8600', transport: 'socket'

       网上很多说法是出这个错的原因是自定义View的构造函数没写全,但是我把三个构造函数写全了,依然报这个错。其实真正的解法是,在引用这个自定义布局的界面根标签里,添加一行代码:

 android:theme="@style/Theme.AppCompat"

 

 

Inapplicable candidate(s): constructor(context: Context, serviceComponent: ComponentName): SessionToken。<html>Unresolved reference. None of the following candidates is applicable because of a receiver type mismatch:<br/>val <T> KClass<T>.java: Class<T>package com.example.musicsphere import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.core.view.WindowCompat import androidx.media3.common.Player import androidx.media3.session.MediaController import androidx.media3.session.SessionToken import com.example.musicsphere.navigation.MainNavHost import com.example.musicsphere.theme.MusicSphereTheme import com.google.common.util.concurrent.MoreExecutors import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class MainActivity : ComponentActivity() { private var mediaController: MediaController? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) WindowCompat.setDecorFitsSystemWindows(window, false) setContent { MusicSphereTheme { Surface(modifier = Modifier.fillMaxSize()) { MainApp() } } } // 绑定媒体控制器 bindMediaController() } private fun bindMediaController() { val sessionToken = SessionToken(this, MediaPlayerService::class.java) val controllerFuture = MediaController.Builder(this, sessionToken).buildAsync() controllerFuture.addListener( { mediaController = controllerFuture.get() }, MoreExecutors.directExecutor() ) } override fun onDestroy() { super.onDestroy() mediaController?.release() } } @Composable fun MainApp() { MainNavHost() }
11-27
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值