Estou tentando criar um modo de exibição personalizado que substituiria um determinado layout que uso em vários lugares, mas estou lutando para fazer isso.
Basicamente, desejo substituir este:
<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 este:
<view class="com.example.MyQuantityBox"
android:id="@+id/dolphinBox"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:myCustomAttribute="@string/my_title"/>
Então, eu não quero um layout customizado, eu quero uma Visualização customizada (não deveria ser possível para esta visualização ter filho).
A única coisa que pode mudar de uma instância de MyQuantityBox para outra é o título. Eu gostaria muito de poder especificar isso no XML (como faço na última linha do XML)
Como posso fazer isso? Devo colocar o RelativeLayout em um arquivo XML em / res / layout e aumentá-lo na minha classe MyBoxQuantity? Se sim, como faço isso?
Obrigado!
Respostas:
Sim, você pode fazer isso. RelativeLayout, LinearLayout, etc são visualizações, portanto, um layout personalizado é uma visualização personalizada. Apenas algo a se considerar porque se você quisesse criar um layout personalizado, você poderia.
O que você deseja fazer é criar um Controle Composto. Você criará uma subclasse de RelativeLayout, adicionará todos os nossos componentes no código (TextView, etc) e em seu construtor poderá ler os atributos passados do XML. Você pode então passar esse atributo para o TextView do título.
http://developer.android.com/guide/topics/ui/custom-components.html
fonte
Um pouco velho, mas pensei em compartilhar como faria, com base na resposta do chubbsondubs: Eu uso
FrameLayout
(veja a Documentação ), já que é usado para conter uma única visão, e aumente nela a visão do xml.Código a seguir:
fonte
this
, 3º parâmetro)Aqui está uma demonstração simples para criar customview (compositeview) inflando de xml
attrs.xml
CustomView.kt
custom_layout.xml
Nós deve usar
merge
aqui em vez deConstraintLayout
porqueSe usarmos
ConstraintLayout
aqui, a hierarquia de layout seráConstraintLayout
->ConstraintLayout
->ImageView
+TextView
=> temos 1 redundanteConstraintLayout
=> não muito bom para o desempenhoUsando activity_main.xml
Resultado
Github demo
fonte
Use o LayoutInflater conforme mostrado abaixo.
fonte
Na prática, descobri que você precisa ter um pouco de cuidado, especialmente se estiver usando um pouco de xml repetidamente. Suponha, por exemplo, que você tenha uma tabela e deseja criar uma linha de tabela para cada entrada em uma lista. Você configurou algum xml:
Em
my_table_row.xml
:Então você deseja criá-lo uma vez por linha com algum código. Ele assume que você definiu um TableLayout pai myTable ao qual anexar as linhas.
Para obter um exemplo simples e claro sobre como lidar com rowButton.setOnClickListener (this), consulte Onclicklistener para um botão criado programaticamente .
fonte