2016-09-21 39 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; 
}