无法使用自定义项目颜色设置服务布局样式
Can't set a Service layout style with a custom item color
我的应用有两个 android 主题。我想使用 attrs.xml 创建一个新的自定义颜色值参考,但这会使应用程序不断崩溃。
虽然我看到其他答案说它与他们一起工作正常,因为这个:
这是我的 style.xml
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="newValue">@color/black</item>
</style>
<style name="Dark.AppTheme" parent="AppTheme">
<item name="colorPrimary">#000000</item>
<item name="colorPrimaryDark">#000000</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="newValue">@color/white</item>
</style>
</resources>
attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="newValue" format="reference|color" />
</resources>
colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#2196F3</color>
<color name="colorPrimaryDark">#3F51B5</color>
<color name="colorAccent">#FF9800</color>
<color name="white">#FFFFFF</color>
<color name="black">#000000</color>
</resources>
查看
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?newValue">
</RelativeLayout>
Logcat
java.lang.RuntimeException: Unable to create service com.moaness.servicetest.mainService: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class <unknown>
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3453)
at android.app.ActivityThread.-wrap4(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1712)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:6701)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:249)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)
Caused by: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class <unknown>
Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class <unknown>
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance0(Native Method)
.
.
.
Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 13: TypedValue{t=0x2/d=0x7f030140 a=-1}
at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:946)
at android.content.res.TypedArray.getDrawable(TypedArray.java:930)
at android.view.View.<init>(View.java:4738)
at android.view.ViewGroup.<init>(ViewGroup.java:597)
at android.widget.RelativeLayout.<init>(RelativeLayout.java:248)
at android.widget.RelativeLayout.<init>(RelativeLayout.java:244)
at android.widget.RelativeLayout.<init>(RelativeLayout.java:240)
这段代码有什么问题?
根本问题是:
UnsupportedOperationException: Failed to resolve attribute...
每当您在布局 inflation 中看到它时,这意味着布局中引用的某些属性(或其中的某些可绘制对象、颜色等)在 [=14 的主题中不可用=] LayoutInflater
用于实例化 View
s。在这种情况下,Context
是 Service
,默认情况下 Service
没有附加主题。
要解决这个问题,只需将 Service
包装在 ContextThemeWrapper
中,并为所需的主题设置适当的 R.style
值,然后从中获取 LayoutInflater
。例如:
ContextThemeWrapper ctw = new ContextThemeWrapper(MyService.this, R.style.AppTheme);
LayoutInflater inflater = LayoutInflater.from(ctw);
View layout = inflater.inflate(R.layout.service_layout, null);
另一个可能的选择是您自己在 Service
上手动设置主题,这样就不需要 ContextThemeWrapper
。例如:
@Override
public void onCreate() {
super.onCreate();
setTheme(R.style.AppTheme);
}
然后您可以直接从 Service
获取它们 LayoutInflater
;例如,
LayoutInflater inflater = LayoutInflater.from(MyService.this);
View layout = inflater.inflate(R.layout.service_layout, null);
理论上这应该适用于任何地方,但由于 Service
通常没有主题,或管理 UI,我不确定它是否可以依赖于每个环境,考虑自定义 Service
子类、制造商和自定义 ROM 修改等
确实,我会说 ContextThemeWrapper
是更可靠的解决方案。
我的应用有两个 android 主题。我想使用 attrs.xml 创建一个新的自定义颜色值参考,但这会使应用程序不断崩溃。
虽然我看到其他答案说它与他们一起工作正常,因为这个:
这是我的 style.xml
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="newValue">@color/black</item>
</style>
<style name="Dark.AppTheme" parent="AppTheme">
<item name="colorPrimary">#000000</item>
<item name="colorPrimaryDark">#000000</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="newValue">@color/white</item>
</style>
</resources>
attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="newValue" format="reference|color" />
</resources>
colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#2196F3</color>
<color name="colorPrimaryDark">#3F51B5</color>
<color name="colorAccent">#FF9800</color>
<color name="white">#FFFFFF</color>
<color name="black">#000000</color>
</resources>
查看
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?newValue">
</RelativeLayout>
Logcat
java.lang.RuntimeException: Unable to create service com.moaness.servicetest.mainService: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class <unknown>
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3453)
at android.app.ActivityThread.-wrap4(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1712)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:6701)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:249)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)
Caused by: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class <unknown>
Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class <unknown>
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance0(Native Method)
.
.
.
Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 13: TypedValue{t=0x2/d=0x7f030140 a=-1}
at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:946)
at android.content.res.TypedArray.getDrawable(TypedArray.java:930)
at android.view.View.<init>(View.java:4738)
at android.view.ViewGroup.<init>(ViewGroup.java:597)
at android.widget.RelativeLayout.<init>(RelativeLayout.java:248)
at android.widget.RelativeLayout.<init>(RelativeLayout.java:244)
at android.widget.RelativeLayout.<init>(RelativeLayout.java:240)
这段代码有什么问题?
根本问题是:
UnsupportedOperationException: Failed to resolve attribute...
每当您在布局 inflation 中看到它时,这意味着布局中引用的某些属性(或其中的某些可绘制对象、颜色等)在 [=14 的主题中不可用=] LayoutInflater
用于实例化 View
s。在这种情况下,Context
是 Service
,默认情况下 Service
没有附加主题。
要解决这个问题,只需将 Service
包装在 ContextThemeWrapper
中,并为所需的主题设置适当的 R.style
值,然后从中获取 LayoutInflater
。例如:
ContextThemeWrapper ctw = new ContextThemeWrapper(MyService.this, R.style.AppTheme);
LayoutInflater inflater = LayoutInflater.from(ctw);
View layout = inflater.inflate(R.layout.service_layout, null);
另一个可能的选择是您自己在 Service
上手动设置主题,这样就不需要 ContextThemeWrapper
。例如:
@Override
public void onCreate() {
super.onCreate();
setTheme(R.style.AppTheme);
}
然后您可以直接从 Service
获取它们 LayoutInflater
;例如,
LayoutInflater inflater = LayoutInflater.from(MyService.this);
View layout = inflater.inflate(R.layout.service_layout, null);
理论上这应该适用于任何地方,但由于 Service
通常没有主题,或管理 UI,我不确定它是否可以依赖于每个环境,考虑自定义 Service
子类、制造商和自定义 ROM 修改等
确实,我会说 ContextThemeWrapper
是更可靠的解决方案。