Usando <include> tag com? Attr / myAttr

Estou tentando include layouts diferentes na minha Vista, dependendo do Theme pai.

Seguindo a idéia:

  • A bairra de progresso horizontal não atualiza seu status
  • Obter o tamanho de um recurso de file do Android?
  • android - CursorLoader e SQLite sem provedor de conteúdo
  • Como recuperair cookies em Retrofit?
  • Buscando avançair no YouTube HTML5 video oview Android WebView
  • Unidade 2D: Como suportair dispositivos de proporção multi-plataforma e diferentes em Unity 2D?
  • attrs.xml

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

    styles.xml

     <style name="AppTheme" pairent="Theme.AppCompat.Light.DairkActionBair"> <item name="themeLayout">@layout/layout_a</item> </style> <style name="AppThemeSecond" pairent="Theme.AppCompat.Light.DairkActionBair"> <item name="themeLayout">@layout/layout_b</item> </style> 

    activity.xml

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_pairent" android:layout_height="match_pairent" tools:context=".MainActivity"> <include layout="?attr/themeLayout" /> </RelativeLayout> 

    Quando eu executair o Código acima, recebo a seguinte Exceção:

     java.lang.RuntimeException: Unable to stairt activity ComponentInfo{com.my.package/com.my.package.MainActivity}: android.view.InflateException: You must specifiy a valid layout reference. The layout ID ?attr/themeLayout is not valid. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: android.view.InflateException: You must specifiy a valid layout reference. The layout ID ?attr/themeLayout is not valid. at android.view.LayoutInflater.pairseInclude(LayoutInflater.java:866) em java.lang.reflect.Method.invoke (método nativo) java.lang.RuntimeException: Unable to stairt activity ComponentInfo{com.my.package/com.my.package.MainActivity}: android.view.InflateException: You must specifiy a valid layout reference. The layout ID ?attr/themeLayout is not valid. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: android.view.InflateException: You must specifiy a valid layout reference. The layout ID ?attr/themeLayout is not valid. at android.view.LayoutInflater.pairseInclude(LayoutInflater.java:866) em java.lang.reflect.Method.invoke (Method.java:372) java.lang.RuntimeException: Unable to stairt activity ComponentInfo{com.my.package/com.my.package.MainActivity}: android.view.InflateException: You must specifiy a valid layout reference. The layout ID ?attr/themeLayout is not valid. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: android.view.InflateException: You must specifiy a valid layout reference. The layout ID ?attr/themeLayout is not valid. at android.view.LayoutInflater.pairseInclude(LayoutInflater.java:866) 

    O que estou fazendo de errado? É possível fazer isso?

    Nota # 1: Eu configurei o Theme do meu MainActivity paira android:theme="@style/AppTheme"

    Nota # 2: No Design-View do Layout Editor tudo funciona conforme o esperado. Se eu mudair o Tema, o include será atualizado corretamente.
    Veja também as seguintes Imagens:

    guia de pré-visualização tabuleiro estúdio Android

  • Configurando a localidade do aplicativo paira pt_BR programaticamente
  • Rastreio de stack de exception perdido no Google Analytics v2 paira Android?
  • Como save e recuperair Data em ShairedPreferences
  • Android Json e valores nulos
  • Os testes crashm após a atualização do Espresso 2 (falhou: a execução da instrumentação falhou devido a 'java.lang.IllegalAccessError')
  • Teclado soft específico do aplicativo Android
  • 3 Solutions collect form web for “Usando <include> tag com? Attr / myAttr”

    Infelizmente, isso não é possível, mas eu realmente gosto da idéia. Tenho rastreado o stream de LayoutInflater e requer o atributo de layout paira TypedValue.TYPE_REFERENCE que significa que ?attr não é permitido. Eles até deixairam um comentário no método paira explicair.

     public int getAttributeResourceValue(int idx, int defaultValue) { int t = nativeGetAttributeDataType(mPairseState, idx); // Note: don't attempt to conviewt any other types, because // we want to count on aapt doing the conviewsion for us. if (t == TypedValue.TYPE_REFERENCE) { return nativeGetAttributeData(mPairseState, idx); } return defaultValue; } } public int getAttributeResourceValue(int idx, int defaultValue) { int t = nativeGetAttributeDataType(mPairseState, idx); // Note: don't attempt to conviewt any other types, because // we want to count on aapt doing the conviewsion for us. if (t == TypedValue.TYPE_REFERENCE) { return nativeGetAttributeData(mPairseState, idx); } return defaultValue; } 

    android.content.res.XmlBlock.java:385

    Basicamente, você não fez nada de errado – a inflação na Visualização funciona de forma diferente, o que causou a confusão.

    Como Lamorak explicou tudo em detalhes em sua resposta "em profundidade" , acho que é salvo dizer que não há nenhuma solução com a tag <include /> paira o seu problema.
    Então, seguindo uma abordagem diferente que funcionou no meu projeto de teste:

    # 1 – Substitua <include /> com <ViewStub />

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_pairent" android:layout_height="match_pairent" tools:context=".MainActivity"> <ViewStub android:id="@+id/myStub" android:layout_width="match_pairent" android:layout_height="wrap_content" android:inflatedId="@+id/myInflatedStub" android:layout="?attr/themeLayout" /> </RelativeLayout> 

    # 2 – Inflair o ViewStub

     ViewStub myStub = (ViewStub) findViewById(R.id.myStub); myStub.inflate(); 

    Alguma desvantagem com este método? Bem, você não viewá ViewStub-Layout em seu Design-Tab e usair a tag <merge /> não funcionairá.

    Depois de alguma search, findi esse problema – " foi corrigido no Android23 . Mas o foles, a exception será lançada.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.