如何让我的应用程序在 WebView 中单击 link 的 URL,对其执行操作,然后加载它?
How can I get my app to get the URL of a link clicked in WebView, perform operations on it, and then load it?
首先我要说我是一个绝对的菜鸟,不会在 Android 中编写任何代码(我基本上是在 Stack Overflow 上通过你们这些很棒的家伙和女孩学习如何做所有事情:)) .我正在制作一个完全只是 WebView 组件的应用程序,我希望它检测何时单击该 WebView 页面中的 link,获取 link 的 url,然后如果原始 link 中包含某个字符串,则将用户重定向到不同的 link。最后,WebView 需要重新加载原始 link 或重定向 link。
这是我认为发生错误的应用程序 java 端的代码:
public class Grades extends AppCompatActivity {
private WebView webview;
String ShowOrHideWebViewInitialUse = "show";
private ProgressBar spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grades);
webview =(WebView)findViewById(R.id.webView);
spinner = (ProgressBar)findViewById(R.id.progressBar1);
webview.setWebViewClient(new CustomWebViewClient());
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
webview.setOverScrollMode(WebView.OVER_SCROLL_NEVER);
webview.loadUrl("myurl.com");
}
// This allows for a splash screen
// (and hide elements once the page loads)
private class CustomWebViewClient extends WebViewClient {
@Override
public void onPageStarted(WebView webview, String url, Bitmap favicon) {
// only make it invisible the FIRST time the app is run
if (ShowOrHideWebViewInitialUse.equals("show")) {
webview.setVisibility(webview.INVISIBLE);
}
}
@Override
public void onPageFinished(WebView view, String url) {
spinner.setVisibility(View.GONE);
ShowOrHideWebViewInitialUse = "hide";
view.setVisibility(webview.VISIBLE);
super.onPageFinished(view, url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.contains("/courses/")) {
url = url + "/grades"
WebView.loadUrl(url);
return false;
} else {
WebView.loadUrl(url)
}
}
}
}
我做了一些故障排除并添加了代码,使应用程序在最后一个 @override 的 logcat 中显示 url。那里的问题是 WebView 没有加载页面,而是在 logcat 打印 current 的 url 中只是一个无限循环WebView 的页面,而不是 link 的 url。所以对我来说,我的问题似乎是双重的,我不知道该怎么做。
有关信息:中间两个 @overrides 仅用于在应用程序启动时加载主页时显示微调器。在最后一个@override 之前,一切似乎都运行良好。
尝试将 return 语句添加到覆盖函数的末尾,并根据 url 更改更改 return 值。
我明白了。最后一个覆盖应该是:
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
System.out.println(Uri.parse(url).getHost());
if ("myurl.com".equals(Uri.parse(url).getHost())) {
webview.loadUrl(url);
String newurl = webview.getUrl();
System.out.println(newurl);
if (newurl.contains("/grades") || newurl.contains("/users") || newurl.contains("/assignments")) {
webview.loadUrl(newurl);
return false;
}
if (newurl.contains("myurl.com") && newurl.contains("/grades") == false && newurl.contains("/users") == false && newurl.contains("/assignments") == false) {
newurl = newurl + "/grades";
System.out.println(newurl);
webview.loadUrl(newurl);
return false;
}
return false;
}
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
首先我要说我是一个绝对的菜鸟,不会在 Android 中编写任何代码(我基本上是在 Stack Overflow 上通过你们这些很棒的家伙和女孩学习如何做所有事情:)) .我正在制作一个完全只是 WebView 组件的应用程序,我希望它检测何时单击该 WebView 页面中的 link,获取 link 的 url,然后如果原始 link 中包含某个字符串,则将用户重定向到不同的 link。最后,WebView 需要重新加载原始 link 或重定向 link。
这是我认为发生错误的应用程序 java 端的代码:
public class Grades extends AppCompatActivity {
private WebView webview;
String ShowOrHideWebViewInitialUse = "show";
private ProgressBar spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grades);
webview =(WebView)findViewById(R.id.webView);
spinner = (ProgressBar)findViewById(R.id.progressBar1);
webview.setWebViewClient(new CustomWebViewClient());
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
webview.setOverScrollMode(WebView.OVER_SCROLL_NEVER);
webview.loadUrl("myurl.com");
}
// This allows for a splash screen
// (and hide elements once the page loads)
private class CustomWebViewClient extends WebViewClient {
@Override
public void onPageStarted(WebView webview, String url, Bitmap favicon) {
// only make it invisible the FIRST time the app is run
if (ShowOrHideWebViewInitialUse.equals("show")) {
webview.setVisibility(webview.INVISIBLE);
}
}
@Override
public void onPageFinished(WebView view, String url) {
spinner.setVisibility(View.GONE);
ShowOrHideWebViewInitialUse = "hide";
view.setVisibility(webview.VISIBLE);
super.onPageFinished(view, url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.contains("/courses/")) {
url = url + "/grades"
WebView.loadUrl(url);
return false;
} else {
WebView.loadUrl(url)
}
}
}
}
我做了一些故障排除并添加了代码,使应用程序在最后一个 @override 的 logcat 中显示 url。那里的问题是 WebView 没有加载页面,而是在 logcat 打印 current 的 url 中只是一个无限循环WebView 的页面,而不是 link 的 url。所以对我来说,我的问题似乎是双重的,我不知道该怎么做。
有关信息:中间两个 @overrides 仅用于在应用程序启动时加载主页时显示微调器。在最后一个@override 之前,一切似乎都运行良好。
尝试将 return 语句添加到覆盖函数的末尾,并根据 url 更改更改 return 值。
我明白了。最后一个覆盖应该是:
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
System.out.println(Uri.parse(url).getHost());
if ("myurl.com".equals(Uri.parse(url).getHost())) {
webview.loadUrl(url);
String newurl = webview.getUrl();
System.out.println(newurl);
if (newurl.contains("/grades") || newurl.contains("/users") || newurl.contains("/assignments")) {
webview.loadUrl(newurl);
return false;
}
if (newurl.contains("myurl.com") && newurl.contains("/grades") == false && newurl.contains("/users") == false && newurl.contains("/assignments") == false) {
newurl = newurl + "/grades";
System.out.println(newurl);
webview.loadUrl(newurl);
return false;
}
return false;
}
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}