2012-12-28 15 views
13

我有一個視圖需要檢測它何時被附加到它的父視圖。視圖如何檢測它何時連接到其父項?

ViewGroup我有OnHierarchyChangeListener它允許我知道子視圖何時被添加/刪除,但我需要相反的東西。

+0

我認爲這是剛[onAttachedToWindow](http://developer.android.com/reference/android/view/View.html#onAttachedToWindow()) – Blundell

+0

我閱讀關於功能,但它看起來不像我所需要的。根據我的理解,只有在視圖即將繪製時纔會調用它,但我必須知道何時將其添加到父項中,甚至可能在繪圖過程開始之前發生。另外,如果視圖被刪除並添加到另一個父級,我不確定這個函數的行爲。它會再次被調用嗎? – user940016

+0

onDetach將被調用,然後onAttach,如何重寫它們並添加日誌記錄以查找 – Blundell

回答

15

您可以創建自定義視圖,做你的東西在其onAttachedToWindow

public class CustomView extends View { 

    public CustomView(Context context) { 
     super(context); 
    } 

    @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     Log.d("CustomView", "onAttachedToWindow called for " + getId()); 
     Toast.makeText(getContext(), "added", 1000).show(); 
    } 
} 

[編輯1]

你能保證你的customview加改正的ViewGroup要

@Override 
protected void onAttachedToWindow() { 
    // TODO Auto-generated method stub 
    super.onAttachedToWindow(); 

    if(((View)getParent()).getId()== R.id.relativelayout2) 
    {   
     Log.d("CustomView","onAttachedToWindow called for " + getId()); 
     Toast.makeText(context, "added", 1000).show();   
    } 

} 
+0

但是,視圖在構建時不會添加到父視圖中!我想知道什麼時候在某個視圖組上調用addView時,將此視圖作爲參數傳遞。 – user940016

+0

對不起,你看,編輯答案。 – Talha

+0

請看我上面的評論。我不確定onAttachedToWindow是否適合我的問題。 – user940016

0

那麼,你有OnHierarchyChangeListener中的視圖,所以我想你可以添加一個回調到你的視圖(通過繼承他們的接口)並將其稱爲f rom OnHierarchyChangeListener。這樣,您的視圖將在調用OnHierarchyChangeListener的同時被調用。

但是,如果發生這種情況,您的視圖的許多屬性(如尺寸)可能尚未定義,我不會感到驚訝。

+0

但是,這限制了功能,只有父母支持它... – user940016

+0

是的,當然:這不是一個父母的自動過程。 – SylvainL

0

我想如果你需要這種控制,最好把它做成一個片段。這樣你就可以訪問更加細化的生命週期。

0

如果您通過實現onViewAdded方法監視父級的附加視圖,則可以用不同的角度來看待此問題。

實施例:

public class LayoutInvokeChildAdded extends RelativeLayout { 

    private OnDoneListener onDoneListener; 

    public LayoutInvokeChildAdded(Context context) { 
     super(context); 
    } 

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

    public LayoutInvokeChildAdded(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    public void onViewAdded(View child) { 
     super.onViewAdded(child); 
     if (onDoneListener != null) 
      onDoneListener.onDone(childe); 
    } 

    public void setOnDoneListener(OnDoneListener onDoneListener) { 
     this.onDoneListener = onDoneListener; 
    } 
} 
相關問題