Estoy tratando de crear una Vista personalizada que reemplace cierto diseño que uso en varios lugares, pero estoy luchando para hacerlo.
Básicamente, quiero reemplazar esto:
<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>
Por esto:
<view class="com.example.MyQuantityBox"
android:id="@+id/dolphinBox"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:myCustomAttribute="@string/my_title"/>
Entonces, no quiero un diseño personalizado, quiero una Vista personalizada (no debería ser posible que esta vista tenga un hijo).
Lo único que podría cambiar de una instancia de MyQuantityBox a otra es el título. Me gustaría mucho poder especificar esto en el XML (como hago en la última línea XML)
¿Cómo puedo hacer esto? ¿Debo poner el RelativeLayout en un archivo XML en / res / layout e inflarlo en mi clase MyBoxQuantity? Si es así, ¿cómo lo hago?
¡Gracias!
Respuestas:
Sí, usted puede hacer esto. RelativeLayout, LinearLayout, etc.son vistas, por lo que un diseño personalizado es una vista personalizada. Solo algo a considerar porque si quisiera crear un diseño personalizado, podría hacerlo.
Lo que quiere hacer es crear un control compuesto. Creará una subclase de RelativeLayout, agregará todos nuestros componentes en código (TextView, etc.), y en su constructor podrá leer los atributos pasados desde el XML. Luego puede pasar ese atributo a su título TextView.
http://developer.android.com/guide/topics/ui/custom-components.html
fuente
Un poco viejo, pero pensé en compartir cómo lo haría, basado en la respuesta de chubbsondubs: Yo uso
FrameLayout
(ver Documentación ), ya que se usa para contener una vista única e inflar en ella la vista desde el xml.Código siguiente:
fuente
this
, tercer parámetro)Aquí hay una demostración simple para crear una vista personalizada (vista compuesta) inflando desde xml
attrs.xml
CustomView.kt
custom_layout.xml
Nosotros deberíamos usar
merge
aquí en vez deConstraintLayout
porqueSi usamos
ConstraintLayout
aquí, la jerarquía de diseño seráConstraintLayout
->ConstraintLayout
->ImageView
+TextView
=> tenemos 1 redundanteConstraintLayout
=> no muy bueno para el rendimientoUtilizando activity_main.xml
Resultado
Demostración de Github
fuente
Utilice LayoutInflater como se muestra a continuación.
fuente
En la práctica, he descubierto que debe tener un poco de cuidado, especialmente si está usando un poco de xml repetidamente. Suponga, por ejemplo, que tiene una tabla en la que desea crear una fila de tabla para cada entrada en una lista. Ha configurado algunos xml:
En
my_table_row.xml
:Entonces desea crearlo una vez por fila con algún código. Se supone que ha definido un TableLayout myTable principal al que adjuntar las Filas.
Para obtener un ejemplo claro y sencillo sobre el manejo de rowButton.setOnClickListener (this), consulte Onclicklistener para obtener un botón creado mediante programación .
fuente