有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何让我的应用程序获取在WebView中单击的链接的URL,对其执行操作,然后加载它?

在这之前,我要说我是一个在Android中编写任何代码的绝对的noob(我基本上是在学习如何通过Stack Overflow的你们这些了不起的家伙和女孩来做每件事:)。我正在制作一个应用程序,它完全只是一个WebView组件,我希望它能够检测到该WebView页面中的链接何时被单击,获取该链接的url,然后如果原始链接中有某个字符串,则将用户重定向到另一个链接。最后,需要使用原始链接或重定向链接重新加载WebView

以下是我在应用程序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没有加载页面,相反,它的日志中只有一个无休止的循环,打印WebView当前页面的url,而不是链接的url。所以在我看来,我的问题是双重的,我不知道该怎么办

仅供参考:中间的两个@overrides仅用于在应用程序启动时加载主页时显示微调器。在最后一次@override之前,一切似乎都很正常


共 (2) 个答案

  1. # 1 楼答案

    我想出来了。最后一个覆盖应该是:

    @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;
        }
    
  2. # 2 楼答案

    尝试将return语句添加到被重写函数的末尾,并由于url更改而更改返回值