2016-09-21 46 views
1

我的一個活動的從未佈置爲它的子視圖寄存器的事件處理程序中的一個裝載的自定義視圖,從不註銷它,我試圖取消註冊在子視圖處置方法,但其不會被調用。漏對在XAML

子視圖使用事件處理程序CrossConnectivity在網絡連接關閉時顯示自身,並在連接重新啓動時隱藏自身。

此子視圖在佈局axml中引用,因此它在佈局被誇大時實例化。

只加載佈局

using Android.App; 
using Android.OS; 

namespace MyNamespace 
{ 
    [Activity(Label = "SimpleActivity")] 
    public class SimpleActivity : Activity 
    { 
     protected override void OnCreate(Bundle savedInstanceState) 
     { 
      base.OnCreate(savedInstanceState); 
      SetContentView(Resource.Layout.SimpleLayout); 
     } 
    } 
} 

上述佈局的活動

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

     <MyNamespace.NetworkStateView 
     android:text="No network" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/textViewNetworkState" /> 
</LinearLayout> 

自定義視圖

using System; 
using Android.Content; 
using Android.Util; 
using Android.Views; 
using Android.Widget; 
using Connectivity.Plugin; 
using Connectivity.Plugin.Abstractions; 

namespace MyNamespace 
{ 
    public class NetworkStateView : TextView 
    { 
     public NetworkStateView(Context ctx) : base(ctx) 
     { 
     } 

     public NetworkStateView(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer) 
     { 
     } 

     public NetworkStateView(Context context, IAttributeSet attrs) : base(context, attrs) 
     { 
     } 

     protected override void OnFinishInflate() 
     { 
      base.OnFinishInflate(); 
      BindConnectivity(); 
     } 

     void BindConnectivity() 
     { 
      CrossConnectivity.Current.ConnectivityChanged += OnConnectivityChanged; 
      UpdateVisibility(); 
     } 

     void OnConnectivityChanged(object sender, ConnectivityChangedEventArgs e) 
     { 
      UpdateVisibility(); 
     } 

     void UpdateVisibility() 
     { 
      Visibility = CrossConnectivity.Current.IsConnected ? ViewStates.Gone : ViewStates.Visible; 
     } 

     protected override void Dispose(bool disposing) 
     { 
      CrossConnectivity.Current.ConnectivityChanged -= OnConnectivityChanged; 
      base.Dispose(disposing); 
     } 
    } 
} 

回答

1

我終於找到了一種方法來解決它而寫的問題,我重寫OnDetachedFromWindow並刪除其中的事件處理程序

protected override void OnDetachedFromWindow() 
{ 
    base.OnDetachedFromWindow(); 
    CrossConnectivity.Current.ConnectivityChanged -= OnConnectivityChanged; 
}