是否存在回調?視圖完成後,我需要回收一些圖像。我一直在網上尋找做什麼,但還沒有找到有用的東西。從視圖中移除父視圖的視圖從視圖中移除的視圖中的父視圖
4
A
回答
7
我一直在尋找這樣的事情。我能找到的最好的是View.OnAttachStateChangeListener。我懷疑它是否理想,因爲它是從窗口中刪除視圖時添加的視圖的回調 - 不是父視圖,但足以滿足我的需求。
4
您可以在自定義View
代碼中覆蓋onDetachedFromWindow
而不是註冊新偵聽器。
1
我墜入陷阱什麼MARMOR說:)
@Override
protected void onDetachedFromWindow() { I want to do something here, sometimes called sometimes not!!}
protected void onAttachedToWindow() {It is working fine, always}
此代碼是在CustomView
。
調用代碼:
contentHolder.removeAllViews();
// ... init my CustomView ...
contentHolder.addView(myCustomView);
contentHolder.requestLayout();// useless, not need
contentHolder.invalidate();// useless, not need
要理解爲什麼不工作,你必須去的Android API裏面:
public void removeAllViews() {
removeAllViewsInLayout();
requestLayout();
invalidate(true);
}
public void removeAllViewsInLayout() {
final int count = mChildrenCount;
if (count <= 0) {
return;
}
final View[] children = mChildren;
mChildrenCount = 0;
final View focused = mFocused;
final boolean detach = mAttachInfo != null;
boolean clearChildFocus = false;
needGlobalAttributesUpdate(false);
for (int i = count - 1; i >= 0; i--) {
final View view = children[i];
if (mTransition != null) {
mTransition.removeChild(this, view);
}
if (view == focused) {
view.unFocus(null);
clearChildFocus = true;
}
view.clearAccessibilityFocus();
cancelTouchTarget(view);
cancelHoverTarget(view);
if (view.getAnimation() != null ||
(mTransitioningViews != null && mTransitioningViews.contains(view))) {
addDisappearingView(view);
} else if (detach) {
view.dispatchDetachedFromWindow();
}
if (view.hasTransientState()) {
childHasTransientStateChanged(view, false);
}
dispatchViewRemoved(view);
view.mParent = null;
children[i] = null;
}
if (clearChildFocus) {
clearChildFocus(focused);
if (!rootViewRequestFocus()) {
notifyGlobalFocusCleared(focused);
}
}
}
的關鍵是在這裏:
if (view.getAnimation() != null ||
(mTransitioningViews != null && mTransitioningViews.contains(view))) {
所以,如果你有動畫(在1個案例中有9個案例沒有),它不會叫做onDetachedFromWindow()
,會搞砸整個用戶界面:)
public void endViewTransition(View view) {
if (mTransitioningViews != null) {
mTransitioningViews.remove(view);
final ArrayList<View> disappearingChildren = mDisappearingChildren;
if (disappearingChildren != null && disappearingChildren.contains(view)) {
disappearingChildren.remove(view);
if (mVisibilityChangingChildren != null &&
mVisibilityChangingChildren.contains(view)) {
mVisibilityChangingChildren.remove(view);
} else {
if (view.mAttachInfo != null) {
view.dispatchDetachedFromWindow();
}
if (view.mParent != null) {
view.mParent = null;
}
}
invalidate();
}
}
}
在某些情況下甚至會用動畫調用。 addDisappearingView(view);
接受的答案建議是這樣的:
addOnAttachStateChangeListener(new OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(View v) {
}
@Override
public void onViewDetachedFromWindow(View v) {
System.out.println("MyCustomView.onViewDetachedFromWindow");
}
});
可悲的是在動畫將不打印所需的文本。
從android.view.ViewGroup API的一些重要代碼:
void dispatchViewRemoved(View child) {
onViewRemoved(child);
if (mOnHierarchyChangeListener != null) {
mOnHierarchyChangeListener.onChildViewRemoved(this, child);
}
}
public void onViewRemoved(View child) {
}
所以,你可以重寫你的RelativeLayout
此方法。 我的動畫是無限的動畫,它不會很快被調用任何方法!
如果你有無限的動畫正確的方法是寫這個代碼,當你調用刪除所有的觀點:
if(contentHolder.getChildCount() > 0){
View child0 = contentHolder.getChildAt(0);
Animation animation = child0.getAnimation();
if(animation != null) {
animation.cancel();
child0.clearAnimation();
}
}
contentHolder.removeAllViews();
現在將被稱爲protected void onDetachedFromWindow()
!
相關問題
- 1. 從父視圖中移除圖像
- 2. 從UIScrollView中移除視圖
- 3. 從SubView中移除視圖
- 4. 從StackScrollView中移除視圖
- 5. Android Access TabHost父視圖中的視圖
- 6. 刪除父視圖
- 7. 添加視圖從子視圖的父視圖
- 8. 從子視圖呈現父視圖backbone.js
- 9. 如何從視圖中移除子視圖,並釋放內存
- 10. Android:從超級視圖中移除視圖
- 11. 從所有表格視圖單元中移除進度視圖
- 12. asp.net mvc父視圖父視圖更新子視圖
- 13. 獲取父視圖的視圖實例
- 14. 做的父視圖子視圖modalviewcontroller resignFirstResponder?
- 15. 如何在從超級視圖中移除UIView的同時刪除所有子視圖和視圖的嵌套?
- 16. 將視圖從一個視圖移動到另一個視圖
- 17. 在視圖中移除圖像
- 18. 如何從父視圖中移除具有圓角的UIView?
- 19. 從其模態視圖隱藏父視圖中的按鈕?
- 20. 如何從WPF中的子視圖更改父視圖屬性?
- 21. 將nsmutabledictionary中的數據從子視圖傳遞給父視圖
- 22. 從彈出視圖中的tableViewController訪問父視圖控制器
- 23. 從子視圖更改父視圖中的數據IOS
- 24. 將對象從父視圖傳遞到MVVM中的子視圖
- 25. 從列表視圖中移除項目
- 26. 從內存中移除視圖
- 27. UIView未從超級視圖中移除
- 28. 從iOS中的視圖中刪除祖先視圖的通知
- 29. 將視圖的子視圖拖到其父視圖
- 30. 基於視圖的NSOutlineView在父視圖上繪製子視圖
API 10上的東西嗎? –