【问题标题】:I want to be able to redirect the user to a specific link in a WebView我希望能够将用户重定向到 WebView 中的特定链接
【发布时间】:2021-05-05 00:03:36
【问题描述】:

需要一些建议。我希望能够将用户重定向到 WebView 中的特定链接。示例:我们转到第一个链接,如果它将我们定向到“google.com”,那么我们必须将用户定向到“http://test.com”。我做了一个实现,在 shouldOverrideUrlLoading 中放置了一个重定向,但是,在 SplashScreen-loading 图像完成它的工作之后,出现了一个白色背景,就是这样。同时,如果您删除重定向代码,则在执行其工作后,SplashScreen - 加载图像,第一个链接打开并正确显示来自 Internet 的页面。打开第一个页面后如何重定向到其他页面?

public class MainActivity extends AppCompatActivity {

private WebView webView;
private final String TAG = "MainActivity";
   
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    webView = findViewById(R.id.webView);
    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webView.loadUrl("http://test/start");
    new TaskForRedirecting().execute();

}


public class TaskForRedirecting extends AsyncTask<Boolean, Void, Boolean> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Boolean doInBackground(Boolean... booleans) {
        new Handler(Looper.getMainLooper()).post(new Runnable() {

            @Override
            public void run() {
                Log.d(TAG, "Start loading here");
                WebViewClient webViewClient = new WebViewClient() {

                    @Override
                    public boolean shouldOverrideUrlLoading(WebView view, String url) {
                        if (url.contains("google.com")) {
                            view.loadUrl("http://test1.com");
                            return false;
                        } else if (url.contains("yahoo.com")) {
                            view.loadUrl("http://test2.com");
                            return false;
                        } else {
                        }
                        return true;
                    }


                    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
                    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                        if (request.getUrl().toString() == "google.com") {
                            view.loadUrl("http://test1.com");
                            view.loadUrl(request.getUrl().toString());
                            return false;
                        } else if (request.getUrl().toString() == "yahoo.com") {
                            view.loadUrl("http://test2.com");
                            return false;
                        }
                        return true;
                    }

                };

                webView.setWebViewClient(webViewClient);
                Log.d(TAG, "Do in background: APP is Working!!!");
            }
        });
        return false;

    }

    @Override
    protected void onPostExecute(Boolean success) {
        success = false;
        if (success) {
            Toast toast = Toast.makeText(MainActivity.this, "App is under maintenance!", Toast.LENGTH_SHORT);
            toast.show();
        } else {
            Toast toast = Toast.makeText(MainActivity.this, "Let's start to work!", Toast.LENGTH_SHORT);
            toast.show();

        }
        Log.d(TAG, "upload - final! ");
    }
}

}

public class SplashScreenActivity extends AppCompatActivity {

long Delay = 6000;
private final String TAG = "SplashScreenActivity";
private WebView webView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_splash_screen);

    new SplashScreen().execute();
}

public class SplashScreen extends AsyncTask<Void, Void, Void> {


    @Override
    protected Void doInBackground(Void...voids) {

        Timer RunSplash = new Timer();

        TimerTask ShowSplash = new TimerTask() {
            @Override
            public void run() {
                finish();

                Intent intent = new Intent(SplashScreenActivity.this, MainActivity.class);
                startActivity(intent);
            }
        };

        RunSplash.schedule(ShowSplash, Delay);
        Log.d(TAG, "ShowSplash - final! ");

        return null;
    }

}

}

【问题讨论】:

  • 您使用的是 https 还是 http 网址?
  • 我正在使用 http
  • 查看更新后的答案

标签: android redirect webview


【解决方案1】:

您的实现需要稍作改动,我们不需要在 AsyncTask 中设置 webview 客户端,而是可以直接设置,但应该在调用 loadurl 之前设置。

我已经删除了asynctask,并在调用loadUrl之前将客户端设置在onCreate方法中。

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = findViewById(R.id.webView);
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        WebViewClient webViewClient = new WebViewClient() {

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url.contains("google.com")) {
                    view.loadUrl("http://test1.com");
                    return true;
                } else if (url.contains("yahoo.com")) {
                    view.loadUrl("http://test2.com");
                    return true;
                } 
                return false;
            }


            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                if (request.getUrl().toString() == "google.com") {
                    view.loadUrl("http://test1.com");
                    return true;
                } else if (request.getUrl().toString() == "yahoo.com") {
                    view.loadUrl("http://test2.com");
                    return true;
                }
                return false;
            }

        };
        webView.setWebViewClient(webViewClient);
        webView.loadUrl("http://test/start");
    }

更新

请查看shouldOverrideUrlLoading Doc,当你想取消当前加载时,你应该返回true,所以当你想加载不同的URL时,然后返回true,否则返回false继续当前加载。 返回 false 表示正在加载到 webview 的 URL 将继续,您的自定义 URL 将不会被加载。

【讨论】:

  • 不幸的是,仍然是白色背景,没有重定向。
  • @V.M.修复了错误,请检查,并尝试输入有效的 URL 而不是 http://test1.com 和其他假人。例如把https://en.wikipedia.org/wiki/Wikipedia
  • Rahat,感谢您的积极帮助。我已经阅读了文档并看到了使用 shouldOverrideUrlLoading 的两个选项:1)当我们希望页面(URL)在我们的应用程序中打开时,我们使用 return false 2)当我们希望 URL 在我们的应用程序之外打开时,使用任何浏览器,我们使用return true。我希望我的链接在应用程序内打开,所以我使用 return false。根据您的建议,我将值更改为 true,但链接没有打开。
  • @V.M.我可以期望答案被接受并获得支持吗?
  • 很遗憾,您的回答并没有给出问题的解决方案,如果您对如何进行重定向仍有想法,我愿意倾听
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多