我希望能够将用户重定向到 WebView 中的特定链接

Posted

技术标签:

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

需要一些建议。。示例:我们转到第一个链接,如果它将我们定向到“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 查看更新后的答案 【参考方案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.我可以期望答案被接受并获得支持吗? 很遗憾,您的回答并没有给出问题的解决方案,如果您对如何进行重定向仍有想法,我愿意倾听

以上是关于我希望能够将用户重定向到 WebView 中的特定链接的主要内容,如果未能解决你的问题,请参考以下文章

Android WebView 不加载自动重定向 url

如果他没有登录,如何将用户重定向到网站中的特定页面?

更新帖子后,我希望将用户重定向到帖子(Django - Python)

如何根据用户类型重定向到特定的布局页面?

Webview 重定向问题

在NodeNS中,如何重定向到单页面应用程序中的特定页面?