【问题标题】:setting background to color reference from attrs.xml crashes将背景设置为 attrs.xml 崩溃中的颜色参考
【发布时间】:2014-04-18 08:44:36
【问题描述】:

我在我的主题中定义了一种颜色,如下所示:

attrs.xml

<attr name="defaultTextColor" format="color|reference" />

styles.xml

<style name="BaseLightTheme" parent="@style/Holo.Theme.Light">
<item name="defaultTextColor">@color/primary_text_holo_light</item>
...
</style>

<style name="BaseDarkTheme" parent="@style/Holo.Theme">
<item name="defaultTextColor">@color/primary_text_holo_dark</item>
...
</style>

每当我将它用于文本颜色时,只需使用 android:textColor="?defaultTextColor" 即可。我想将此颜色用于视图背景,但这会使应用程序崩溃...为什么?我该如何解决?

这只是崩溃:

<View
        android:layout_width="1dp"
        android:layout_height="match_parent"
        android:background="?defaultTextColor" />

编辑:添加了 logcat

这是我针对此错误的 logcat(第 19 行是上述视图的行):

04-18 11:12:05.654: E/ACRA(8006): android.view.InflateException: Binary XML file line #19: Error inflating class <unknown>
04-18 11:12:05.654: E/ACRA(8006):   at org.holoeverywhere.LayoutInflater._createView(LayoutInflater.java:262)
04-18 11:12:05.654: E/ACRA(8006):   at org.holoeverywhere.LayoutInflater.onCreateView(LayoutInflater.java:470)
04-18 11:12:05.654: E/ACRA(8006):   at org.holoeverywhere.LayoutInflater.createViewFromTag(LayoutInflater.java:316)
04-18 11:12:05.654: E/ACRA(8006):   at org.holoeverywhere.LayoutInflater.rInflate(LayoutInflater.java:604)
04-18 11:12:05.654: E/ACRA(8006):   at org.holoeverywhere.LayoutInflater.inflate(LayoutInflater.java:422)
04-18 11:12:05.654: E/ACRA(8006):   at org.holoeverywhere.LayoutInflater.inflate(LayoutInflater.java:372)
04-18 11:12:05.654: E/ACRA(8006):   at org.holoeverywhere.LayoutInflater.inflate(LayoutInflater.java:367)
04-18 11:12:05.654: E/ACRA(8006):   at com.mf.androfit.fragments.WorkoutFragment$CardioViewFragment.onCreateViewHandler(WorkoutFragment.java:865)
04-18 11:12:05.654: E/ACRA(8006):   at com.mf.activitylibrary.fragments.BaseFragment.onCreateView(BaseFragment.java:185)
04-18 11:12:05.654: E/ACRA(8006):   at android.support.v4.app._HoloFragment.onCreateView(_HoloFragment.java:124)
04-18 11:12:05.654: E/ACRA(8006):   at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478)
04-18 11:12:05.654: E/ACRA(8006):   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:928)
04-18 11:12:05.654: E/ACRA(8006):   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1105)
04-18 11:12:05.654: E/ACRA(8006):   at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
04-18 11:12:05.654: E/ACRA(8006):   at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1461)
04-18 11:12:05.654: E/ACRA(8006):   at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
04-18 11:12:05.654: E/ACRA(8006):   at com.mf.pagermanager.MFragStatePagerAdapter.finishUpdate(MFragStatePagerAdapter.java:170)
04-18 11:12:05.654: E/ACRA(8006):   at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
04-18 11:12:05.654: E/ACRA(8006):   at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
04-18 11:12:05.654: E/ACRA(8006):   at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.View.measure(View.java:15696)
04-18 11:12:05.654: E/ACRA(8006):   at org.holoeverywhere.widget.LinearLayout.measureVertical(LinearLayout.java:877)
04-18 11:12:05.654: E/ACRA(8006):   at org.holoeverywhere.widget.LinearLayout.onMeasure(LinearLayout.java:956)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.View.measure(View.java:15696)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)
04-18 11:12:05.654: E/ACRA(8006):   at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.View.measure(View.java:15696)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)
04-18 11:12:05.654: E/ACRA(8006):   at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.View.measure(View.java:15696)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)
04-18 11:12:05.654: E/ACRA(8006):   at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.View.measure(View.java:15696)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)
04-18 11:12:05.654: E/ACRA(8006):   at org.holoeverywhere.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:452)
04-18 11:12:05.654: E/ACRA(8006):   at org.holoeverywhere.widget.LinearLayout.measureVertical(LinearLayout.java:784)
04-18 11:12:05.654: E/ACRA(8006):   at org.holoeverywhere.widget.LinearLayout.onMeasure(LinearLayout.java:956)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.View.measure(View.java:15696)
04-18 11:12:05.654: E/ACRA(8006):   at android.support.v4.widget.MySlidingPaneLayout.onMeasure(MySlidingPaneLayout.java:523)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.View.measure(View.java:15696)
04-18 11:12:05.654: E/ACRA(8006):   at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:639)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.View.measure(View.java:15696)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)
04-18 11:12:05.654: E/ACRA(8006):   at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
04-18 11:12:05.654: E/ACRA(8006):   at org.holoeverywhere.widget.WindowDecorView.onMeasure(WindowDecorView.java:113)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.View.measure(View.java:15696)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)
04-18 11:12:05.654: E/ACRA(8006):   at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.View.measure(View.java:15696)
04-18 11:12:05.654: E/ACRA(8006):   at org.holoeverywhere.widget.LinearLayout.measureVertical(LinearLayout.java:877)
04-18 11:12:05.654: E/ACRA(8006):   at org.holoeverywhere.widget.LinearLayout.onMeasure(LinearLayout.java:956)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.View.measure(View.java:15696)
04-18 11:12:05.654: E/ACRA(8006):   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851)
04-18 11:12:05.654: E/ACRA(8006):   at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
04-18 11:12:05.654: E/ACRA(8006):   at com.android.internal.policy.impl

【问题讨论】:

  • 然后发布你的日志
  • 这样做了...我刚收到InflateException...
  • 在 L 中,他们修复了您无法将属性引用用于颜色可绘制对象的问题。你在运行什么版本?它应该适用于 api 21。不幸的是,您不能在早期版本中使用属性引用来表示颜色。
  • 我个人使用的是v20...但是如果该功能没有集成到支持库中就没有用了。至少对我来说。谢谢

标签: android xml android-styles


【解决方案1】:

我认为您不能简单地通过属性定义视图的背景。 为此,您需要创建一个自定义视图。

您可以找到更多信息here

一个简单的例子是在你的 src 目录中创建一个单独的 Java 类:

public class SuperView extends View { 

//You set all background attributes through your java code. 
}

之后,您转到您的 layout.xml 并添加您的自定义视图:

<my.application.SuperView 
    android:...../>       

您可以在 xml 中为该视图添加一些额外的通用属性。

【讨论】:

    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 2010-11-08
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多