2014-10-08 4 views
3

У меня рисует фон (так называемый card_background_selector_light), который в основном выглядит следующим образом:LinearLayout фон на основе темы

<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> 

Я получил почти идентичную вытяжку под названием card_background_selector_dark. Основываясь на теме, я бы хотел показать одну или другую.

Чтобы сделать это, я определил атрибут в attrs.xml:

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

И включил его в моих двух стилях:

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

и

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

Фактический LinearLayout теперь выглядит так:

<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> 

Это все прекрасно работает в Android студии предварительного просмотра (я могу изменить тему и она меняется соответственно), но когда я пытаюсь запустить его на реальном устройстве я получаю следующее исключение:

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} 

Я читал много других тем (например, this one и this one) здесь, которые в основном делают это одинаково, но почему-то это не работает для меня. Есть идеи?

Update

В соответствии с просьбой, вот 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(); 
} 
+0

уверен, что 'андроида: background' должен быть рисуем и не атрибут, который указывает также ошибки – tyczj

+0

@tyczj Ну, это ссылка на растяжимой. – Baz

+0

Вы уверены, что используете одну из этих двух тем? – Simas

ответ

3

Вы используете контекст приложения для раздувания элементов списка. Попробуйте использовать контекст активности.

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

Да, это было неожиданно. Но я думаю, это имеет смысл. Большое спасибо! Я пытался исправить это часами. Ваша награда за награду придется ждать 22 часа. – Baz

+0

Это также объясняет, почему он работал правильно в других частях приложения, но не здесь. – Baz

+2

Да. Немного смущает, когда использовать какой-то контекст. При использовании контекста приложения инфляция будет производиться с помощью темы по умолчанию для системы, на которой вы работаете, а не на том, что определено в вашем приложении. [эта статья] (http://www.doubleencore.com/2013/06/context/) имеет довольно хорошее объяснение контекста. Особенно ** Контекстные возможности ** Тема. –

0

Эта ошибка возникает, если мы не ставим тему из класса деятельности. Обязательно вызовите функцию activity.setTheme(); метод перед вызовом setContentView.

+0

Я вызываю 'setTheme()' – Baz

+0

Как раз для цели тестирования, вы пытались заменить @ drawable/card_background_selector_dark на некоторый цвет или фактическое изображение вместо выталкиваемого xml. Также вставьте код своей активности. – Manish

+0

Цвета - это то же самое, попробовал это тоже. Проводка всего кода активности может быть чрезмерной. Если вы можете сообщить мне, какую именно часть вас интересует, я могу опубликовать это вместо этого. – Baz

Смежные вопросы