J'essaie de créer une vue personnalisée qui remplacerait une certaine mise en page que j'utilise à plusieurs endroits, mais j'ai du mal à le faire.
En gros, je veux remplacer ceci:
<RelativeLayout
android:id="@+id/dolphinLine"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@drawable/background_box_light_blue"
android:padding="10dip"
android:layout_margin="10dip">
<TextView
android:id="@+id/dolphinTitle"
android:layout_width="200dip"
android:layout_height="100dip"
android:layout_alignParentLeft="true"
android:layout_marginLeft="10dip"
android:text="@string/my_title"
android:textSize="30dip"
android:textStyle="bold"
android:textColor="#2E4C71"
android:gravity="center"/>
<Button
android:id="@+id/dolphinMinusButton"
android:layout_width="100dip"
android:layout_height="100dip"
android:layout_toRightOf="@+id/dolphinTitle"
android:layout_marginLeft="30dip"
android:text="@string/minus_button"
android:textSize="70dip"
android:textStyle="bold"
android:gravity="center"
android:layout_marginTop="1dip"
android:background="@drawable/button_blue_square_selector"
android:textColor="#FFFFFF"
android:onClick="onClick"/>
<TextView
android:id="@+id/dolphinValue"
android:layout_width="100dip"
android:layout_height="100dip"
android:layout_marginLeft="15dip"
android:background="@android:drawable/editbox_background"
android:layout_toRightOf="@+id/dolphinMinusButton"
android:text="0"
android:textColor="#2E4C71"
android:textSize="50dip"
android:gravity="center"
android:textStyle="bold"
android:inputType="none"/>
<Button
android:id="@+id/dolphinPlusButton"
android:layout_width="100dip"
android:layout_height="100dip"
android:layout_toRightOf="@+id/dolphinValue"
android:layout_marginLeft="15dip"
android:text="@string/plus_button"
android:textSize="70dip"
android:textStyle="bold"
android:gravity="center"
android:layout_marginTop="1dip"
android:background="@drawable/button_blue_square_selector"
android:textColor="#FFFFFF"
android:onClick="onClick"/>
</RelativeLayout>
Par ça:
<view class="com.example.MyQuantityBox"
android:id="@+id/dolphinBox"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:myCustomAttribute="@string/my_title"/>
Donc, je ne veux pas de mise en page personnalisée, je veux une vue personnalisée (il ne devrait pas être possible pour cette vue d'avoir un enfant).
La seule chose qui pourrait changer d'une instance d'une MyQuantityBox à une autre est le titre. J'aimerais beaucoup pouvoir le spécifier dans le XML (comme je le fais sur la dernière ligne XML)
Comment puis-je faire ceci? Dois-je mettre RelativeLayout dans un fichier XML dans / res / layout et le gonfler dans ma classe MyBoxQuantity? Si oui, comment faire?
Merci!
Réponses:
Oui, vous pouvez le faire. RelativeLayout, LinearLayout, etc. sont des vues, donc une mise en page personnalisée est une vue personnalisée. Juste quelque chose à considérer car si vous vouliez créer une mise en page personnalisée, vous le pourriez.
Ce que vous voulez faire est de créer un contrôle composé. Vous allez créer une sous-classe de RelativeLayout, ajouter tous nos composants dans le code (TextView, etc.), et dans votre constructeur, vous pouvez lire les attributs transmis à partir du XML. Vous pouvez ensuite transmettre cet attribut à votre titre TextView.
http://developer.android.com/guide/topics/ui/custom-components.html
la source
Un peu vieux, mais j'ai pensé partager comment je le ferais, basé sur la réponse de chubbsondubs: j'utilise
FrameLayout
(voir documentation ), car il est utilisé pour contenir une seule vue, et y gonfler la vue du xml.Code suivant:
la source
this
, 3ème paramètre)Voici une démo simple pour créer une vue personnalisée (vue composée) en gonflant à partir de xml
attrs.xml
CustomView.kt
custom_layout.xml
Nous devrions utiliser
merge
ici au lieu deConstraintLayout
parce queSi nous utilisons
ConstraintLayout
ici, la hiérarchie de mise en page seraConstraintLayout
->ConstraintLayout
->ImageView
+TextView
=> nous avons 1 redondantConstraintLayout
=> pas très bon pour les performancesUtilisation de activity_main.xml
Résultat
Démo Github
la source
Utilisez le LayoutInflater comme indiqué ci-dessous.
la source
En pratique, j'ai trouvé que vous devez être un peu prudent, surtout si vous utilisez un peu de xml à plusieurs reprises. Supposons, par exemple, que vous ayez une table que vous souhaitez créer une ligne de table pour chaque entrée d'une liste. Vous avez configuré du xml:
Dans
my_table_row.xml
:Ensuite, vous voulez le créer une fois par ligne avec du code. Il suppose que vous avez défini un TableLayout parent myTable auquel attacher les lignes.
Pour un exemple clair et simple sur la gestion de rowButton.setOnClickListener (this), consultez Onclicklistener pour un bouton créé par programme .
la source