Créez une vue personnalisée en gonflant une mise en page?

J’essaie de créer une vue personnalisée qui remplacerait une certaine disposition que j’utilise à plusieurs endroits, mais j’ai du mal à le faire.

En gros, je veux remplacer ceci:

  

Par ça:

  

Donc, je ne veux pas une 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 de MyQuantityBox à une autre est le titre. Je voudrais bien pouvoir spécifier ceci dans le XML (comme je le fais sur la dernière ligne XML)

Comment puis-je faire ceci? Dois-je placer le RelativeLayout dans un fichier XML dans / res / layout et le gonfler dans ma classe MyBoxQuantity? Si oui, comment puis-je le faire?

Merci!

Oui, vous pouvez le faire. RelativeLayout, LinearLayout, etc. sont des vues, donc une présentation personnalisée est une vue personnalisée. Juste quelque chose à considérer, car si vous souhaitez créer une mise en page personnalisée, vous pouvez.

Ce que vous voulez faire, c’est créer un contrôle composé. Vous allez créer une sous-classe de RelativeLayout, append tous vos composants dans le code (TextView, etc.), et dans votre constructeur, vous pouvez lire les atsortingbuts transmis depuis le XML. Vous pouvez ensuite transmettre cet atsortingbut à votre titre TextView.

http://developer.android.com/guide/topics/ui/custom-components.html

Un peu vieux, mais je pensais partager comment je le ferais, basé sur la réponse de chubbsondubs: J’utilise FrameLayout (voir la documentation ), car il est utilisé pour contenir une seule vue, et y gonfler la vue du xml.

Code suivant:

 public class MyView extends FrameLayout { public MyView(Context context, AtsortingbuteSet attrs, int defStyle) { super(context, attrs, defStyle); initView(); } public MyView(Context context, AtsortingbuteSet attrs) { super(context, attrs); initView(); } public MyView(Context context) { super(context); initView(); } private void initView() { View view = inflate(getContext(), R.layout.my_view_layout, null); addView(view); } } 

Utilisez le gonfleur de mise en page, comme je l’ai montré ci-dessous

  public View myView(){ View v; // Creating an instance for View Object LayoutInflater inflater = (LayoutInflater)getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = inflater.inflate(R.layout.myview, null); TextView text1 = (TextView) v.findViewById(R.id.dolphinTitle); Button btn1 = (Button) v.findViewById(R.id.dolphinMinusButton); TextView text2 = (TextView) v.findViewById(R.id. dolphinValue); Button btn2 = (Button) v.findViewById(R.id. dolphinPlusButton); return v; } 

En pratique, j’ai constaté que vous devez être un peu prudent, surtout si vous utilisez un peu le xml à plusieurs resockets. Supposons, par exemple, que vous souhaitiez créer une ligne de tableau 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 une tableTable MyTable parente à laquelle associer les lignes.

 for (int i=0; i 

Pour un exemple simple et clair sur la gestion de rowButton.setOnClickListener (this), voir Onclicklistener pour un bouton créé par programmation .