2012-10-25 47 views

回答

1

我使用以下技術:

<!-- 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(例如LinearLayoutRelativeLayout),並且您想要在聲明性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對象在後一種情況下獲得。

+1

我給它一個嘗試...謝謝:) – Ron

+1

如果我用這個阻止幾次......我如何避免通過ID解決視圖問題?該ID /圖像會在那裏幾次,不是嗎? – Ron

+2

'id'只是查找視圖的標識符。它甚至不需要在層次結構中是唯一的。兩個視圖具有相同的ID時沒有任何反應。唯一的問題是,當你調用View.findViewById(int)時,存在兩個或多個具有相同ID的視圖,因爲在這種情況下,你可能找不到你要找的東西(你可能想使用'setTag(Object )'在某些情況下)。然而,用我的代碼你不會有任何問題,因爲inflater返回最後創建的層次結構,並且可以在此層次結構上調用'findViewById',並在'content.xml'中不重複ID – Raffaele

相關問題