Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo crear el diseño de una vista personalizada de forma programática?

Esta pregunta probablemente ha sido contestada muchas veces antes, estoy seguro, tan amablemente me dirigen a una respuesta existente si hay uno.

En una actividad, puede crear un LinearLayout mediante programación de la siguiente manera:

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout ll = new LinearLayout(this); ll.setOrientation(LinearLayout.VERTICAL); ll.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); TextView tv1 = new TextView(this); tv1.setText("HELLO"); ll.addView(tv1); TextView tv2 = new TextView(this); tv2.setText("WORLD"); ll.addView(tv2); setContentView(ll); } 

¿Cómo haces lo mismo dentro de una subclase View personalizada? No hay métodos setContentView o onCreate

2 Solutions collect form web for “¿Cómo crear el diseño de una vista personalizada de forma programática?”

De acuerdo, descubrí una manera de hacerlo. Básicamente, en lugar de subclases de la clase View directamente, es necesario subclase la clase más superior que normalmente se definiría en XML. Por ejemplo, si su vista personalizada necesita un LinearLayout como su clase más alta, entonces su vista personalizada debería simplemente subclase LinearLayout.

Por ejemplo:

 public class MyCustomView extends LinearLayout { public MyCustomView(Context context, AttributeSet attrs) { super(context, attrs); setOrientation(LinearLayout.VERTICAL); setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); TextView tv1 = new TextView(context); tv1.setText("HELLO"); addView(tv1); TextView tv2 = new TextView(context); tv2.setText("WORLD"); addView(tv2); } } 

¿Está subclasificando LinearLayout un "hack"? No tan lejos como puedo ver. Algunas subclases oficiales de View hacen lo mismo, como NumberPicker y SearchView (a pesar de que inflar sus diseños de XML).

Tras la reflexión, en realidad es una respuesta bastante obvia.

Si entiendo tu pregunta, necesitas usar inflar, como esto:

 public final class ViewHolder { public TextView title; public TextView artist; public TextView duration; public ImageView thumb_image; //A class for the ViewHolder } // Put this where you want to inflate this layout, could be a customlistview View view = getLayoutInflater().inflate(R.layout.your_layout, null); holder = new ViewHolder(); holder.title = (TextView)view.findViewById(R.id.title); // title holder.artist = (TextView)view.findViewById(R.id.artist); // artist name holder.duration = (TextView)view.findViewById(R.id.duration); // duration holder.thumb_image=(ImageView)view.findViewById(R.id.list_image); // thumb image 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.