从 Xamarin Android 中的另一个 class 访问 Main Class 中定义的 EditText

Access EditText defined in the Main Class from another class in Xamarin Android

我正在 Android 中设计一个浏览器应用程序,我的 WebView 恰好附加到 WebViewClient class,我有一个应该显示当前页面 URL 的编辑文本在 webview 中..我可以访问主要 class 中的 EditText 但我不能在 WebViewClient class 中...我需要逻辑来帮助我从 WebViewClient class 访问此 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

        }
}

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

委托即可实现。

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

的内容
  public delegate void OnLinkSelectedHandler(string url);

在包含 edittext 的 Activity 中创建 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://whosebug.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);
        }
    }

MyWebViewClient 中的 ShouldOverrideUrlLoading 方法中实现调用委托的逻辑:

    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;
         
        }
    }

这是运行 gif。