嗨,大家好,我想在Android中創建一個FieldSet
組件。 (類似於html
),所以類似that。所以我想讓我的自定義組件有孩子,並有一個董事會。主板部分已經完成,但是我在顯示組件時遇到了一些問題。我正在關注this的答案。我這裏還有我的份:Android自定義組件不會顯示其子代
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>
的Android工作室上面的佈局預覽(好像組件的佈局是完全沒問題):
以下是我添加它:
<?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>
的Android工作室預覽如下。 (所以佈局通吃的空間,孩子需要還要注意的是組件樹表示組件TextView
被添加到佈局,因爲它應該是不過孩子有0高度和寬度:。
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>
結果: 就沒有什麼:(,無評論)
我也看了this答案,嘗試過,但addView
沒有幫助 - 它會導致遞歸,當我使用addToRoot=True
它是沒有必要的。我試過LinearLayout
,而不是Relative
- 沒有改變任何東西。我想我搞砸了LayoutInflater.from(getContext()) .inflate(R.layout.field_set, this, true);
。同樣值得指出的是,孩子們佔有一席之地。所以基本上,如果我增加了放入FieldSet組件的內容的高度,它會佔用更多的高度,並推動下面的所有組件。我爲這個Visibility
這個問題加油。或者有的圖層低於另一圖層,仍然高度和寬度都是零。有什麼建議麼?
任何形式的幫助,非常感謝。
最好的問候,
您正在擴展'ViewGroup',因此您必須自己負責測量和佈置子View。或者,你可以擴展一個已經處理子項的'ViewGroup'子類,就像你想要的那樣;例如'FrameLayout','LinearLayout','RelativeLayout'等。 –
感謝您的回覆@Mike。在發佈這個問題之前,我嘗試過擴展不同的類:View,ViewGroup,LinearLayout,RelativeLayout,FrameLayout。它沒有改變。我應該實施一些處理繪圖的更多方法嗎? (如果是的話,應該包含什麼) – deathangel908
不是這一點,可能。測量和佈置孩子可能是一種痛苦。如果我是你,我會先在一個已經處理過這個問題的課程中工作。例如,至少沒有理由不延長'RelativeLayout',然後擺脫當前是膨脹佈局中父代的多餘元素,而是將'RelativeLayout'和'TextView'內部的代碼包裝在''標籤中。而且,在通貨膨脹之後,像這樣的「視圖」變得有點低效,而且並不是真正必要的。 –