0
我有一個Views
塊,其中包含ImageView
,Button
和TextView
。我想在Java
代碼中動態創建此塊。有沒有辦法在XML中定義這個塊,改變src
/text
屬性並將它附加到我目前的layout
?Android - 動態構建視圖塊並將其附加到佈局
謝謝!
羅恩
我有一個Views
塊,其中包含ImageView
,Button
和TextView
。我想在Java
代碼中動態創建此塊。有沒有辦法在XML中定義這個塊,改變src
/text
屬性並將它附加到我目前的layout
?Android - 動態構建視圖塊並將其附加到佈局
謝謝!
羅恩
我使用以下技術:
<!-- content.xml -->
<merge>
<ImageView android:id="@+id/image />
<Button android:id="@+id/button />
<TextView android:id="@+id/text />
</merge>
然後充氣使用LayoutInflater
:
View block = inflater.inflate(R.layout.content, root, attach);
(TextView) textView = (TextView) block.findViewById(R.id.text);
textView.setText(text);
我發現這非常有用,當你寫一個自定義View
延伸的ViewGroup
(例如LinearLayout
或RelativeLayout
),並且您想要在聲明性XML中定義內容。例如
public class MyWidget extends LinearLayout {
// Invoked by all of the constructors
private void setup() {
Context ctx = getContext();
inflate(ctx, R.layout.content, this);
((TextView) findViewById(R.id.text)).setText(
ctx.getString(R.string.hello_world)
);
}
}
一個可能的變化是使用,如果你不需要它Layout
而不是<merge>
。該LayoutInflater
可以通過Activity.getLayoutInflater()
或Context
通過getSystemService()
任何(你要的結果轉換爲LayoutInflater
對象在後一種情況下獲得。
我給它一個嘗試...謝謝:) – Ron
如果我用這個阻止幾次......我如何避免通過ID解決視圖問題?該ID /圖像會在那裏幾次,不是嗎? – Ron
'id'只是查找視圖的標識符。它甚至不需要在層次結構中是唯一的。兩個視圖具有相同的ID時沒有任何反應。唯一的問題是,當你調用View.findViewById(int)時,存在兩個或多個具有相同ID的視圖,因爲在這種情況下,你可能找不到你要找的東西(你可能想使用'setTag(Object )'在某些情況下)。然而,用我的代碼你不會有任何問題,因爲inflater返回最後創建的層次結構,並且可以在此層次結構上調用'findViewById',並在'content.xml'中不重複ID – Raffaele