2012-05-29 90 views
3

我有一個名爲ActionButton的自定義按鈕,我試圖獲取對並行視圖層次結構中的另一個視圖的引用。我想過使用findViewById(int id),但我一直收到NullPointerExceptions,所以我試圖通過getRootView()獲得對RootView的引用,並從那裏獲得與findViewById(int id)的視圖。現在的問題是getRootView而不是返回佈局或null,它返回我的ActionButton調用該方法。查看getRootView返回自己

這裏是我的ActionButton,在那裏我試圖讓參考:

public class ActionButton extends Button { 

    protected void onFinishInflate(){ 
     super.onFinishInflate(); 
     log(getRootView() == this) //true, what I don't understand... 
     ConnectionLayer connectionLayer = (ConnectionLayer) findViewById(R.id.connection_layer); //Returns null... 
    } 
} 

而且我layout.xml文件的概述:

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

     (much more xml elements) 

     <com.cae.design.reaction.ui.ActionButton 
      android:id="@+id/actionButton" 
      android:layout_width="match_parent" 
      android:layout_height="150dp" 
      android:layout_gravity="center_vertical" /> 

    </LinearLayout> 

    <com.cae.design.reaction.ui.ConnectionLayer 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/connection_layer" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 
    </com.cae.design.reaction.ui.ConnectionLayer> 

</FrameLayout> 

我真的很感激,如果你能向我解釋爲什麼getRootView返回視圖本身,或者可以給我一個提示,我可以如何以任何其他方式引用它。

回答

0

嘗試撥打getParent()代替,並根據需要將結果轉換爲ViewGroup。然後,您可以使用getChildCount()getChildAt()訪問其他子視圖。

+0

不,這也行不通。當我調用'getParent'時,它返回null,所以它看起來像問題是我的ActionButton沒有添加到視圖層次結構。但是我認爲當onFinishInflate方法被調用時,佈局會完成... – Artjom

+1

嗯,可能需要在後面的調用中做你的邏輯,比如'onPreDraw'或'onAttatchedToWindow'或類似的東西。 – wsanville

2

如果你看一看的getRootView方法的源代碼:

public View getRootView() { 
     if (mAttachInfo != null) { 
      final View v = mAttachInfo.mRootView; 
      if (v != null) { 
       return v; 
      } 
     } 

     View parent = this; 

     while (parent.mParent != null && parent.mParent instanceof View) { 
      parent = (View) parent.mParent; 
     } 

     return parent; 
    } 

你會看到,當這個方法返回自己的唯一情況是,如果認爲還沒有的情況下附加到視圖層次結構(並且mAttachInfo.mRootView不爲空),並且它沒有父代或父代不是View實例。 此致敬禮。

0

getRootView()返回自身,因爲當ActionButton完成時,如果它的父代沒有。我的意思是,當您調用getRootView()時,ActionButton不會連接到LinearLayout。我這樣做,當我需要一個根視圖:

new Thread(new Runnable() { 

    @Override 
    public void run() 
    { 
        // wait until LinearLayout will finish inflating and this 
        // view will be connected to it 
     while(getRootView() == this) {} 
     // do your buisness now 
    } 
}).start();