2017-04-14 5 views
1

j'ai créé un style personnalisé:Anko ignorant layout_margin défini dans le style

<style name="Static"> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:layout_marginEnd">5dp</item> 
</style> 

J'étendu anko avec une fonction statique:

inline fun ViewManager.static(theme: Int = R.style.Static, init: TextView.() -> Unit) = ankoView(::TextView, theme, init) 

Quand j'utiliser dans ma mise en page:

static { text = resources.getString(R.string.name) } 

La valeur marginEnd est ignorée.

Si j'ajoute une marge manuellement anko:

static { text = resources.getString(R.string.name) }.lparams { marginEnd = dip(5) } 

La marge est très bien. Est-ce que vous savez ce qui se passe que anko ignore ma valeur de marge ou n'importe quelle autre façon de définir une marge prédéfinie pour une fonction anko de vue étendue?

Répondre

3

Ce n'est pas problème Anko, voici comment fonctionne Android:

Si vous spécifiez layout_margin dans un style personnalisé, ce style doit être appliqué de façon explicite à chaque vue individuel que vous souhaitez avoir la marge spécifiée (comme vu dans l'exemple de code ci-dessous). Inclure ce style dans un thème et l'appliquer à votre application ou à une activité ne fonctionnera pas.

En effet, les attributs qui commencent par layout_ sont LayoutParams, ou comme dans cet exemple son MarginLayoutParams. Chaque ViewGroup a sa propre implémentation LayoutParams. Et donc layout_margin n'est pas seulement un attribut général qui peut être appliqué n'importe où. Il doit être appliqué dans le contexte d'un ViewGroup qui le définit spécifiquement comme un argument valide.

Regardez here pour plus d'informations. Comme @John pointé dans sa réponse, l'utilisation d'un style n'est pas une option pour définir les paramètres de mise en page.

1

Donc, j'ai développé une fonction à utiliser dans applyRecursively qui itère sur les vues et applique les mises en page que je veux appliquer.

La solution:

I cherché à définir matchParent pour la largeur et de la hauteur et une marge de 16DP pour une TableView, je créé une nouvelle classe qui étend TableLayout

class TableViewFrame(context: Context) : TableLayout(context) 

puis dans la fonction lorsque la vue est un TableViewFrame J'applique mes mises en page

fun applyTemplateViewLayouts(view: View) { 
    when(view) { 
     is TableViewFrame -> { 
      when(view.layoutParams) { 
       is LinearLayout.LayoutParams -> { 
        view.layoutParams.height = matchParent 
        view.layoutParams.width = matchParent 
        (view.layoutParams as LinearLayout.LayoutParams).margin = view.dip(16) 
       } 
      } 
     } 
    } 
} 

Pour utiliser la fonction, dans la définition de la vue, je viens de passer dans le applyRecursively:

verticalLayout { 
     tableViewFrame { 
      tableRow { 
       ... 
      } 
     } 
    } 
}.applyRecursively { view -> applyTemplateViewLayouts(view) } 

j'ai écrit un article au moyen d'une explication plus détaillée: https://medium.com/@jonathanrafaelzanella/using-android-styles-with-anko-e3d5341dd5b4

+1

merci monsieur! Tu es mon héros personnel maintenant! :) – Antek