从Xamarin Android中的另一个类访问主类中定义的EditText

从Xamarin Android中的另一个类访问主类中定义的EditText,android,class,xamarin,android-edittext,Android,Class,Xamarin,Android Edittext,我在安卓系统中设计了一个浏览器应用程序,而我的WebView恰好连接到一个WebViewClient类,我有一个编辑文本,它应该在webview中显示当前页面的URL。我可以在main类中访问EditText,但在WebViewClient类中无法访问。我需要逻辑帮助我从WebViewClient类中访问此EditText,谢谢…这是我到目前为止的代码 class Internet : AppCompatActivity,Android.Webkit.IDownloadListener, Ge

我在安卓系统中设计了一个浏览器应用程序,而我的WebView恰好连接到一个WebViewClient类,我有一个编辑文本,它应该在webview中显示当前页面的URL。我可以在main类中访问EditText,但在WebViewClient类中无法访问。我需要逻辑帮助我从WebViewClient类中访问此EditText,谢谢…这是我到目前为止的代码

 class Internet : AppCompatActivity,Android.Webkit.IDownloadListener, GestureDetector.IOnGestureListener, BottomNavigationView.IOnNavigationItemSelectedListener, IDialogInterfaceOnClickListener
      {
           //Declaring the EdiText
             EditText editText;
        protected override void OnCreate(Bundle OnSavedInstanceState){
          //Assigning a value to the EditText
         edittext=this.FindViewById<EditText>(Resource.Id.edittext1);
     }
   //WebViewClient class
public class webViewClient : WebViewClient,IWebResourceRequest
        {
          //Anything that can make me access EditText defined in the main class

        }
}
class Internet:AppCompatActivity、Android.Webkit.IDownloadListener、GestureDetector.IOnGestureListener、BottomNavigationView.IOnNavigationItemSelectedListener、IDialogInterfaceOnClickListener
{
//声明EdiText
编辑文本编辑文本;
受保护的重写void OnCreate(Bundle OnSavedInstanceState){
//为编辑文本指定一个值
edittext=this.findviewbyd(Resource.Id.edittext1);
}
//WebViewClient类
公共类webViewClient:webViewClient,IWebResourceRequest
{
//任何可以让我访问主类中定义的EditText的内容
}
}

从WebViewClient类访问主类中定义的视图,谢谢。

您可以通过委派来实现它

首先,我们可以声明一个委托类型,用于控制
Edittext

  public delegate void OnLinkSelectedHandler(string url);
在Activity contains
edittext
中创建一个
OnLinkSelectedHandler
的实现,该实现将访问的url设置为
edittext

 public void ISVistedSoLink(string url)
{
            editText1.Text = url;
}
这是我的
MainActivity.cs
代码

  [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        EditText editText1;
        WebView webView1;

        public delegate void OnLinkSelectedHandler(string url);
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);

             editText1= FindViewById<EditText>(Resource.Id.editText1);

             webView1 = FindViewById<WebView>(Resource.Id.webView1);
            webView1.LoadUrl("http://stackoverflow.com");
            webView1.Settings.JavaScriptEnabled = true;
            webView1.SetWebViewClient(new MyWebviewClient(this.ISVistedSoLink));
        }

        public void ISVistedSoLink(string url)
        {
            editText1.Text = url;
        }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
这里是运行gif


让一个类直接修改另一个类中的UI元素不是一个好做法。最好让
webViewClient
引发另一个类可以订阅的事件,或者将委托传递给
webViewClient
,等等,在名称空间中定义它怎么样?它会在那里工作吗?我不打算修改,但要访问它们。现在我需要使用WebViewClient方法
OnPageFinished
OnPageStarted
,访问和修改progressbar,我如何使用构造函数和委托来完成
    internal class MyWebviewClient : WebViewClient
    {
        private OnLinkSelectedHandler linkSelected;

        public MyWebviewClient(OnLinkSelectedHandler handler)
        {
            linkSelected = handler;
        }
        public override void OnPageStarted(WebView view, string url, Bitmap favicon)
        {
            base.OnPageStarted(view, url, favicon);
        }
        public override bool ShouldOverrideUrlLoading(WebView view, string url)
        {
            view.LoadUrl(url);
           
            this.linkSelected(url);
           
            return true;
         
        }
    }