2011-08-17 41 views
4

爲什麼不能正常工作?在視圖的構造函數中使用View.getParent()

private ScrollView findScrollParent(View v) 
{ 

    if(v==null) 
    { 
     return null; 
    } 
    else if(v instanceof ScrollView) 
    { 
     return (ScrollView) v; 
    } 
    else 
    { 
     return findScrollParent((View)v.getParent()); 
    } 
} 

CustomView(Context context, AttributeSet as) 
{ 
    super(context,as); 
    ScrollView sv = findScrollParent(this); 
} 

這是充氣我的XML文件:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent"> 
<ScrollView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <LinearLayout android:layout_height="wrap_content" 
     android:layout_width="wrap_content"> 

     <com.myapp.CustomView android:layout_height="wrap_content" 
       android:layout_width="wrap_content"/> 

    </LinearLayout> 

</ScrollView> 
</RelativeLayout> 

我想在自定義視圖的滾動視圖的參考。我的findScrollParent方法發現LinearLayout然後返回null。我在View v的構造函數中調用這個方法,是這樣的問題嗎?

回答

3

如果你在視圖的構造函數中調用它,那麼它肯定沒有它的父指派呢?

據我可以看到一掠父屬性未設置直到視圖被添加到此時它會像做父來源:

child.mParent = this; 

所以,如果你是在那麼我的猜測是太早了,視圖會在構建完成後被添加。我並不是100%確定你們在討論什麼樣的課程組合,以及如何讓他們融合在一起,因此可能會看到錯誤的來源。

編輯

與僞代碼只是爲了澄清的過程可能是這樣的

View view = new View(); // Inside here you are calling your method - which won't work 
addView(view);   // The parent is only just being set as a result of this method 
view.getParent();  // At this point we can now return the expected result 

EDIT 2 - @codelark的建議

private _scrollView; // member variable 

private ScrollView getScrollView() 
{ 
    if (null == _scrollView) { 
     _scrollView = findScrollParent(this); 
    } 
    return _scrollView; 
} 
+0

嗯...這是有道理的。但爲什麼該方法找到LinearLayout父項?我添加了一些代碼來顯示我如何使用該功能。 – you786

+0

另外,據我所知,視圖的構造/實例化是從根視圖向下移動的。如果構造視圖,然後有addView調用它們,那麼我的方法應該工作,不應該嗎? – you786

+1

我還不確定你到底想要達到什麼目的?您的自定義視圖無法添加到視圖組中,因此在構造函數中調用getParent過早。 –