从Xamarin Android中的另一个类访问主类中定义的EditText
我在安卓系统中设计了一个浏览器应用程序,而我的WebView恰好连接到一个WebViewClient类,我有一个编辑文本,它应该在webview中显示当前页面的URL。我可以在main类中访问EditText,但在WebViewClient类中无法访问。我需要逻辑帮助我从WebViewClient类中访问此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
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 containsedittext
中创建一个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;
}
}