I am facing a weird issue when I try to assign a color to a TextView
from an attribute in my styles.xml
instead from the colors.xml
.
So I have my styles.xml
(excerpt) which defines the color for "color_title":
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="color_title" format="reference" />
<style name="DayTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="color_title">@color/buttonHoverBackground</item>
</style>
<style name="NightTheme" parent="Theme.AppCompat.NoActionBar">
<item name="color_title">@color/buttonBackground</item>
</style>
</resources>
If I use it in a normal layout, it works fine. But when I try to use it in a list item which is used in a custom array adapter to populate a ListView, I get an android.view.InflateException:
"Binary XML file line #XX: Error inflating class android.widget.TextView".
This works fine in the adapter:
<TextView
android:id="@+id/ticker_article_title"
android:layout_width="match_parent"
android:textColor="@color/black"
android:layout_height="wrap_content"
android:textSize="@dimen/news_detail_info_box_title"/>
This doesn't work
<TextView
android:id="@+id/ticker_article_title"
android:layout_width="match_parent"
android:textColor="?attr/color_title"
android:layout_height="wrap_content"
android:textSize="@dimen/news_detail_info_box_title"/>
So I am wondering if this is normal or why I can't use style attributes in an ArrayAdapter while it still works in every other part of the app.
Edit: Here is the full stacktrace
E/AndroidRuntime: FATAL EXCEPTION: main
Process: de.mycompany.myapp, PID: 20045
android.view.InflateException: Binary XML file line #96: Error inflating class <unknown>
at android.view.LayoutInflater.createView(LayoutInflater.java:633)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
at de.mycompany.myapp.screens.adapter.NewsOverviewTickerAdapter.getView(NewsOverviewTickerAdapter.java:90)
at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:220)
at android.widget.AbsListView.obtainView(AbsListView.java:2346)
at android.widget.ListView.measureHeightOfChildren(ListView.java:1270)
at android.widget.ListView.onMeasure(ListView.java:1182)
at android.view.View.measure(View.java:17429)
at android.widget.RelativeLayout.measureChild(RelativeLayout.java:697)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:481)
at android.view.View.measure(View.java:17429)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1488)
at android.view.View.measure(View.java:17429)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
at android.view.View.measure(View.java:17429)
at com.ryanharter.viewpager.ViewPager.onMeasure(ViewPager.java:1511)
at android.view.View.measure(View.java:17429)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
at android.view.View.measure(View.java:17429)
at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:868)
at android.view.View.measure(View.java:17429)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
at android.view.View.measure(View.java:17429)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124)
at android.view.View.measure(View.java:17429)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
at android.view.View.measure(View.java:17429)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
at android.view.View.measure(View.java:17429)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
at android.view.View.measure(View.java:17429)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2815)
at android.view.View.measure(View.java:17429)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:137
Line 13 in the stacktrace (de.mycompany.myapp.screens.adapter.NewsOverviewTickerAdapter.getView(NewsOverviewTickerAdapter.java:90)
) points to this part in the custom ArrayAdapter:
if (rootView == null) {
final LayoutInflater inflater = (LayoutInflater) getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
rootView = inflater.inflate(
R.layout.fragment_newsoverview_ticker_listitem, null);
...
Edit2: Here is an example which shows the usage of ?attr/
in View and the ListView within the same layout file and fragment. The button uses android:textColor="?attr/color_settings_sublabels"
:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button_meine_ressorts"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="@dimen/news_detail_info_box_title"
android:textColor="?attr/color_settings_sublabels"
android:background="?attr/color_background"
android:text="@string/menu_favorites_edit"
android:textAllCaps="true"/>
<include layout="@layout/load_data_shimmer"
android:id="@+id/loadingPanel_initial"/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/news_ticker_list"/>
</LinearLayout>
</RelativeLayout>