2016-10-19 5 views
0

私は、多かれ少なかれ、このような何かをして古いコード、継承されていますAndroidの事前L、APPCOMPAT-V7:24.2.1と背景のテーマの参照クラッシュ

(名前が変更されている)

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

    <style name="my_style_a" parent="@style/AppTheme"> 
    <item name="my_reference">@drawable/drawable_a</item> 
    </style> 

    <style name="my_style_b" parent="@style/AppTheme"> 
    <item name="my_reference">@drawable/drawable_b</item> 
    </style> 

drawable_aとdrawable_b:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:state_pressed="true"> 
     <shape android:shape="rectangle"> 
      <solid android:color="#ff000000" /> 
     </shape> 
    </item> 

</selector> 

そしてレイアウトの部分がある:

 <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="?my_reference" 
      android:src="@drawable/image" /> 

トリックは、そのスタイルは、(ユーザーがボタンをクリックすると、それは変更する必要があります)プログラムでロードされている。

(それが5.0以上で正常に動作します)

ContextThemeWrapper contextThemeWrapper = new ContextThemeWrapper(context, themeId); 
    LayoutInflater inflater = LayoutInflater.from(contextThemeWrapper); 

    View view = inflater.inflate(R.layout.activity_layout, parent, false); 

最後のビューは、Android 4.4以下に例外をスローすることを膨張させます

Caused by: android.content.res.Resources$NotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x2/d=0x7f010010 a=-1} 
    at android.content.res.Resources.loadDrawable(Resources.java:1967) 
    at android.content.res.TypedArray.getDrawable(TypedArray.java:601) 
    at android.view.View.<init>(View.java:3337) 
    at android.widget.ImageView.<init>(ImageView.java:114) 
    at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:57) 
    at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:53) 
    at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106) 
    at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1013) 
    at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1072) 
    at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:675) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)  
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)  

そして、com.android.support:appcompat-v7ライブラリを24+に更新した後にのみ発生しました(新しいAPIが必要なので)。それはappcompat-v7、バージョン18(またはこのようなもの)でもうまく動作しますが、古いライブラリを残すオプションはありません(L-Lの前バージョンのサポートを中止することはできません...)

ありますかこれのための簡単な修正(アプリケーションの半分を書き換えることを含めて)?

答えて

0

OK、いくつかの掘削後、私は解決策を見つけたので:

あなただけのビューの前にテーマを設定する必要がありますが膨張した:

activity.setTheme(themeId); 
関連する問題