我希望能够将用户重定向到 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 中的特定链接的主要内容,如果未能解决你的问题,请参考以下文章