LinearLayout theme based background

I have a dedicated background (called card_background_selector_light

) that looks something like this:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/card_state_pressed_light" android:state_pressed="true" />
    <item android:drawable="@drawable/card_background_light" />
</selector>

      

I have an almost identical drawable called card_background_selector_dark

. Based on the topic, I'd like to show one or the other.

To do this, I have defined an attribute in attrs.xml

:

<attr name="listItemBackground" format="reference"></attr>

      

And included it in my two styles:

<style name="AppThemeDark" parent="android:Theme.Holo">
    <item name="listItemBackground">@drawable/card_background_selector_dark</item>
</style>

      

and

<style name="AppThemeLight" parent="android:Theme.Holo.Light">
    <item name="listItemBackground">@drawable/card_background_selector_light</item>
</style>

      

The actual LinearLayout

now looks like this:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:background="?attr/listItemBackground">

</LinearLayout>

      

This all works fine in the Android Studio preview (I can change the theme and it changes accordingly), but as soon as I try to run it on the device itself, I get the following exception:

android.view.InflateException: Binary XML file line #11: Error inflating class <unknown>
    at android.view.LayoutInflater.createView(LayoutInflater.java:620)
    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:469)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    at org.jhi.android.germinatescan.adapter.ListRowAdapter.getView(ListRowAdapter.java:54)
    at android.widget.AbsListView.obtainView(AbsListView.java:2255)
    at android.widget.ListView.makeAndAddView(ListView.java:1790)
    at android.widget.ListView.fillDown(ListView.java:691)
    at android.widget.ListView.fillFromTop(ListView.java:752)
    at android.widget.ListView.layoutChildren(ListView.java:1630)
    at android.widget.AbsListView.onLayout(AbsListView.java:2087)
    at android.view.View.layout(View.java:14817)
    at android.view.ViewGroup.layout(ViewGroup.java:4631)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
    at android.view.View.layout(View.java:14817)
    at android.view.ViewGroup.layout(ViewGroup.java:4631)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
    at android.view.View.layout(View.java:14817)
    at android.view.ViewGroup.layout(ViewGroup.java:4631)
    at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:690)
    at android.view.View.layout(View.java:14817)
    at android.view.ViewGroup.layout(ViewGroup.java:4631)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
    at android.view.View.layout(View.java:14817)
    at android.view.ViewGroup.layout(ViewGroup.java:4631)
    at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374)
    at android.view.View.layout(View.java:14817)
    at android.view.ViewGroup.layout(ViewGroup.java:4631)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
    at android.view.View.layout(View.java:14817)
    at android.view.ViewGroup.layout(ViewGroup.java:4631)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1983)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1740)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
    at android.view.Choreographer.doCallbacks(Choreographer.java:574)
    at android.view.Choreographer.doFrame(Choreographer.java:544)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5001)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
    at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.reflect.InvocationTargetException
     at java.lang.reflect.Constructor.constructNative(Native Method)
     at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
     at android.view.LayoutInflater.createView(LayoutInflater.java:594)
     at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
     at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
     at android.view.LayoutInflater.inflate(LayoutInflater.java:469)
     at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
     at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
     at org.jhi.android.germinatescan.adapter.ListRowAdapter.getView(ListRowAdapter.java:54)
     at android.widget.AbsListView.obtainView(AbsListView.java:2255)
     at android.widget.ListView.makeAndAddView(ListView.java:1790)
     at android.widget.ListView.fillDown(ListView.java:691)
     at android.widget.ListView.fillFromTop(ListView.java:752)
     at android.widget.ListView.layoutChildren(ListView.java:1630)
     at android.widget.AbsListView.onLayout(AbsListView.java:2087)
     at android.view.View.layout(View.java:14817)
     at android.view.ViewGroup.layout(ViewGroup.java:4631)
     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
     at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
     at android.view.View.layout(View.java:14817)
     at android.view.ViewGroup.layout(ViewGroup.java:4631)
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
     at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
     at android.view.View.layout(View.java:14817)
     at android.view.ViewGroup.layout(ViewGroup.java:4631)
     at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:690)
     at android.view.View.layout(View.java:14817)
     at android.view.ViewGroup.layout(ViewGroup.java:4631)
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
     at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
     at android.view.View.layout(View.java:14817)
     at android.view.ViewGroup.layout(ViewGroup.java:4631)
     at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374)
     at android.view.View.layout(View.java:14817)
     at android.view.ViewGroup.layout(ViewGroup.java:4631)
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
     at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
     at android.view.View.layout(View.java:14817)
     at android.view.ViewGroup.layout(ViewGroup.java:4631)
     at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1983)
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1740)
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
     at android.view.Choreographer.doCallbacks(Choreographer.java:574)
     at android.view.Choreographer.doFrame(Choreographer.java:544)
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
     at android.os.Handler.handleCallback(Handler.java:733)
     at android.os.Handler.dispatchMessage(Handler.java:95)
     at android.os.Looper.loop(Looper.java:136)
     at android.app.ActivityThread.main(ActivityThread.java:5001)
     at java.lang.reflect.Method.invokeNative(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:515)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
     at dalvik.system.NativeStart.main(Native Method)
 Caused by: android.content.res.Resources$NotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x2/d=0x7f010002 a=-1}

      

I've read many other threads (like this one and this one here, which basically do it the same way, but somehow it doesn't work for me. Any ideas?

Update

As requested, here is my method onCreate()

:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    setTheme(preferences.getBoolean(PreferenceUtils.PREF_THEME, isDefaultThemeDark()) ? DARK_THEME : LIGHT_THEME);

    setContentView(R.layout.activity_main);

    INSTANCE = this;

    /* Make sure the default preferences are set */
    PreferenceUtils.setDefaults(this);

    databaseHandler = new DatabaseHandler(this);

    List<Row> items = databaseHandler.getAllItems();
    adapter = new ListRowAdapter(getApplicationContext(), android.R.layout.simple_list_item_1, items);

    if (items.size() > 0)
    {
        Row row = items.get(items.size() - 1);
        int col = row.getLastFilledColumn() + 1;

        if (col == getNrOfBarcodes())
        {
            currentColumn = 0;
        }
        else
        {
            currentColumn = col;
            currentListRow = row;
        }
    }

    listView = (ListView) findViewById(R.id.list_scanned_items);
    listView.setAdapter(adapter);

    hiddenInput = (EditText) findViewById(R.id.input);
    hiddenInput.setOnKeyListener(this);
    hiddenInput.requestFocus();

    /* Redirect every focus from the list view to the input text */
    listView.setOnFocusChangeListener(this);

    setCodeFormats();
}

      

+3


source to share


2 answers


You are using the application context to inflate the list items. Try using the activity context.



adapter = new ListRowAdapter(this, android.R.layout.simple_list_item_1, items);

      

+3


source


This error occurs if we do not set a theme from the activity class. Make sure to call the activity.setTheme () function; before calling setContentView.



0


source







All Articles