从 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。
我正在 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。