O componente personalizado do Android não exibe seus filhos
Oi pessoal, eu quero criar umFieldSet
componente no Android. (igual ahtml
) então algo comoeste. Então, eu quero que meu componente personalizado tenha filhos e tenha uma placa. A parte da placa já está pronta, mas tenho alguns problemas com a exibição do componente. estou seguindoesta responda. Aqui estão minhas partes:
FieldSet.java:
public class FieldSet extends ViewGroup {
//... 3 constructors
@Override
protected void onFinishInflate()
int index = getChildCount();
// Collect children declared in XML.
View[] children = new View[index];
while(--index >= 0) {
children[index] = getChildAt(index);
}
// Pressumably, wipe out existing content (still holding reference to it).
this.detachAllViewsFromParent();
// Inflate new "template".
final View template = LayoutInflater.from(getContext()).inflate(R.layout.field_set, this, true);
// Obtain reference to a new container within "template".
final ViewGroup vg = (ViewGroup)template.findViewById(R.id.field_set_content);
index = children.length;
// Push declared children into new container.
while(--index >= 0) {
vg.addView(children[index]);
}
}
field_set.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:duplicateParentState ="true"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:id="@+id/field_set_content"
android:duplicateParentState ="true"
android:background="@drawable/field_set_frame"
android:orientation="vertical"
android:padding="20dp">
</RelativeLayout>
<!-- This is the title label -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="50dp"
android:paddingLeft="50dp"
android:paddingRight="50dp"
android:layout_marginRight="50dp"
android:layout_centerHorizontal="true"
android:text="Label"
android:background="@color/colorLoginBlue"
android:padding="5dp"
android:id="@+id/field_set_label"
android:textColor="@color/colorSmallTxt" />
</RelativeLayout>
Visualização do layout do Android studio acima (parece que o layout do componente está completamente bom):
Aqui está como eu o adiciono:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:fs="http://schemas.android.com/apk/res-auto"
tools:context="my.package.DeleteThis">
<my.package.FieldSet
android:layout_width="match_parent"
fs:label="Injected Label"
android:layout_height="wrap_content"
android:gravity="bottom">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="50sp"
android:text="Inner text" />
</my.package.FieldSet>
<TextView
android:layout_width="match_parent"
android:text="BELOW"
android:layout_height="wrap_content" />
</RelativeLayout>
A visualização do estúdio para Android está abaixo. (Portanto, o layout ocupa todo o espaço necessário para as crianças.Observe também que a árvore de componentes mostra esse componenteTextView
é adicionado ao layout como deve ser . No entanto, as crianças têm 0 altura e largura:
field_set_frame.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle" >
<corners android:radius="7dp" />
<padding android:bottom="2dp"/>
<padding android:right="2dp"/>
<padding android:left="2dp"/>
<padding android:top="2dp"/>
<stroke android:width="1dp" android:color="@color/colorFieldSetBorder" />
</shape>
</item>
</selector>
RESULTADO: Apenas nada :(, sem comentários)
Eu também liesta responder e tentei, masaddView
não ajudou - causa recursão e não é necessário quando usoaddToRoot=True
. eu tenteiLinearLayout
, ao invés deRelative
- não muda nada. Eu acho que estrago em algum lugarLayoutInflater.from(getContext()) .inflate(R.layout.field_set, this, true);
. Também vale ressaltar que as crianças ocupam o lugar. Então, basicamente, se eu aumentar a altura do conteúdo que coloco no meu componente FieldSet, ela terá mais altura e empurrará todos os componentes que estão embaixo. Eu pareço esse tipo deVisibility
questão. Ou alguma camada fica abaixo de outra, ainda a altura e a largura das crianças são zeros. Alguma sugestão?
Qualquer tipo de ajuda é muito apreciada.
Cumprimentos,