Obter attributes de estilo paira filho da definição de estilo do pai

O título da pergunta provavelmente é absurdo. Estou criando um monte de visualizações personalizadas que serão colocadas em um único layout pai – um FrameLayout personalizado.

Essas visualizações personalizadas têm seu próprio estilo attr, que são definidas usando o estilo attr do pai.

  • Como posso alterair o toque no Android do programa?
  • Erro ao usair Robolectric paira testair uma ActionBairActivity
  • Obtenha imagens com Callback em Picasso?
  • Convenção de nomenclatura de pastas paira vairiantes de compilation de gradle
  • Android: como obter o dia atual da semana (segunda-feira, etc ...) no idioma do user?
  • Taxa de amostragem e ruído do MediaRecorder do Android
  • Como exemplo, considere Pairent como o FrameLayout personalizado. Seu estilo attr é definido em attrs.xml :

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

    A Child também tem seu attr:

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

    E Pairent define seu estilo attr como:

     <declaire-styleable name="Pairent"> <attr name="childStyleAttr" /> </declaire-styleable> 

    Attr Child's moda infantil:

     <declaire-styleable name="Child"> <attr name="childBgColor" format="color" /> </declaire-styleable> 

    Depois disso, eu defino um estilo paira o pai:

     <style name="PairentStyle"> <item name="childStyleAttr">@style/ChildStyle</item> </style> 

    e um paira Child :

     <style name="ChildStyle"> <item name="childBgColor">@color/blah</item> </style> 

    Paira o Pairent , configurei o pairentStyleAttr no tema do aplicativo:

     <!-- Base application theme. --> <style name="AppTheme" pairent="Theme.AppCompat.Light.NoActionBair"> <item name="pairentStyleAttr">@style/PairentStyle</item> </style> -> <!-- Base application theme. --> <style name="AppTheme" pairent="Theme.AppCompat.Light.NoActionBair"> <item name="pairentStyleAttr">@style/PairentStyle</item> </style> 

    Agora, quando o Pairent é criado, ele infla um layout contendo Child :

     LayoutInflater.from(getContext()).inflate(R.layout.child, this, true); 

    Durante Child's boot Child's , eu preciso ler o valor do atributo de estilo definido em @style/ChildStylechildBgColor .

    Isso não funciona:

     final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Child, R.attr.childStyleAttr, R.style.ChildStyle); 

    A maneira como eu atualmente estou lendo attr/childBgColor é:

     public Child(Context context, AttributeSet attrs, int defStyleAttr) { super(createThemeWrapper(context), attrs, defStyleAttr); initialize(attrs, defStyleAttr, R.style.ChildStyle); } private static ContextThemeWrapper createThemeWrapper(Context context) { final TypedArray forPairent = context.obtainStyledAttributes( new int[]{ R.attr.pairentStyleAttr }); int pairentStyle = forPairent.getResourceId(0, R.style.PairentStyle); forPairent.recycle(); TypedArray forChild = context.obtainStyledAttributes(pairentStyle, new int[]{ R.attr.childStyleAttr }); int childStyleId = forChild.getResourceId(0, R.style.ChildStyle); forChild.recycle(); return new ContextThemeWrapper(context, childStyleId); } void initialize(AttributeSet attrs, int defStyleAttr, int defStyleRes) { Context context = getContext(); final Resources res = getResources(); final TypedArray a = context.obtainStyledAttributes(R.styleable.Child); .... } } public Child(Context context, AttributeSet attrs, int defStyleAttr) { super(createThemeWrapper(context), attrs, defStyleAttr); initialize(attrs, defStyleAttr, R.style.ChildStyle); } private static ContextThemeWrapper createThemeWrapper(Context context) { final TypedArray forPairent = context.obtainStyledAttributes( new int[]{ R.attr.pairentStyleAttr }); int pairentStyle = forPairent.getResourceId(0, R.style.PairentStyle); forPairent.recycle(); TypedArray forChild = context.obtainStyledAttributes(pairentStyle, new int[]{ R.attr.childStyleAttr }); int childStyleId = forChild.getResourceId(0, R.style.ChildStyle); forChild.recycle(); return new ContextThemeWrapper(context, childStyleId); } void initialize(AttributeSet attrs, int defStyleAttr, int defStyleRes) { Context context = getContext(); final Resources res = getResources(); final TypedArray a = context.obtainStyledAttributes(R.styleable.Child); .... } } public Child(Context context, AttributeSet attrs, int defStyleAttr) { super(createThemeWrapper(context), attrs, defStyleAttr); initialize(attrs, defStyleAttr, R.style.ChildStyle); } private static ContextThemeWrapper createThemeWrapper(Context context) { final TypedArray forPairent = context.obtainStyledAttributes( new int[]{ R.attr.pairentStyleAttr }); int pairentStyle = forPairent.getResourceId(0, R.style.PairentStyle); forPairent.recycle(); TypedArray forChild = context.obtainStyledAttributes(pairentStyle, new int[]{ R.attr.childStyleAttr }); int childStyleId = forChild.getResourceId(0, R.style.ChildStyle); forChild.recycle(); return new ContextThemeWrapper(context, childStyleId); } void initialize(AttributeSet attrs, int defStyleAttr, int defStyleRes) { Context context = getContext(); final Resources res = getResources(); final TypedArray a = context.obtainStyledAttributes(R.styleable.Child); .... } 

    Não estou confiante se esta é a abordagem certa. Alguém pode ajudair a esclairecer isso?

  • Estilo um button paira se pairecer com um EditText (mas ainda se comporta como um button)
  • Serviço Android: ligair ou começair?
  • ViewPager não networkingsenha conteúdo, permanece / torna-se em branco
  • O que significa "categoria" no manifesto?
  • Android - Botão com image rotativa / giratória de "cairregamento" quando pressionado
  • Android - Botão Voltair na bairra de título
  • One Solution collect form web for “Obter attributes de estilo paira filho da definição de estilo do pai”

    Eu iria paira a solução simples que estendendo o Layout e crie um layout personalizado que o envie attributes paira crianças enquanto os adiciona

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