2013-04-18 140 views
0

我還沒有在互聯網上找到答案一段時間,現在我問你是否可以幫助我。android,將XML佈局視圖添加到自定義類中的充氣視圖

簡稱: 我應該如何重寫addView()(或別的東西)添加在XML定義我的意見「自定義視圖充氣XML佈局」

長: 我想創建一個自定義視圖我Android應用程序,所以我從RelativeLayout創建了一個乾淨的子類。在這裏,我讓Inflater加載一個xml佈局來獲得一個不錯的風格。

但現在,我想在自定義視圖內添加一些內容,但不想在程序中添加它(這很簡單),但是使用xml。我不能跨越的差距,我的腦海裏,找到解決方案...

代碼: 自定義類:

<packagename....Slider 
    android:id="@+id/slider1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@color/Red" > 
     <TextView 
      android:id="@+id/heading" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="HEADING" /> 

     <Button 
      android:id="@+id/button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:text="bbb" /> 

... 

TextView的和按鍵是:使用子類

public class Slider extends RelativeLayout { 

    private RelativeLayout _innerLayout; 

    public Slider(Context context) { 
     super(context); 
     init(); 
    } 

    public Slider(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    protected void init() { 
     LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     _innerLayout = (RelativeLayout) layoutInflater.inflate(R.layout.layout_r, this); 

    } 

    @Override 
    public void addView(View child) { 
     //if (_innerLayout != null) _innerLayout.addView(child); 
     super.addView(child); 
    } 

... all other addView's are overridden in the same way 

XML文件添加到子類......當然......但在那之後,我從Slider,TextView,Button和我從R.layout.layout_r的膨脹佈局中得到了3個孩子。但我只想要1個孩子(layout_r),其中包含Button和TextView。

正如你可以在addView中看到的,我試圖簡單地將傳遞的「View child」添加到_innerLayout。那不起作用。 Android框架不斷給你打電話addView並與結尾的StackOverflowError

兩件事要告訴你太:

  1. 我知道添加的XML瀏覽犯規致電給addView,但我已經重寫所有其他人也和所有看起來是一樣的,所以他們不需要展示他們。

  2. 調試說我,那addView被稱爲前_innerLayout得到膨脹的佈局

爲2的原因是什麼?

你能幫助我嗎?

回答

0

充氣這個佈局中的自定義視圖構造方法僅覆蓋您addView()方法在您的自定義視圖Slider並檢查孩子的數量。 如果getChildCount() == 0,那麼這是第一次加法,它是視圖初始化。

科特林例如:

override fun addView(child: View?, index: Int, params: ViewGroup.LayoutParams?) { 
    if (childCount == 0) { 
     super.addView(child, index, params) 
    } else { 
     // Do my own addition 
    } 
} 
相關問題