问题描述
我有一个链接到我的商店网址的WebView应用程序,这里的问题是有一个按钮(添加到主屏幕)按钮,我想在我的WebView中隐藏该按钮类。我试图使用javascript将其隐藏在OnProgressChange方法中,它可以工作,但是,当我单击类别按钮并按主屏幕按钮或再次返回主屏幕时,再次出现“添加到主屏幕按钮”。有人可以帮我还是指导我如何完成这项任务。 this is the shop link
//WebView Settings and Configuration
Wview = (WebView) findViewById(R.id.webView);
WebSettings webSettings = Wview.getSettings();
webSettings.setJavaScriptEnabled(true);
Wview.setWebChromeClient(new chromeClient());
Wview.setWebViewClient(new myClient());
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
Wview.loadUrl(homeUrl);
}
private class myClient extends WebViewClient {
@Override
public void onPageStarted(WebView view,String url,Bitmap favicon) {
super.onPageStarted(view,url,favicon);
}
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view,String url) {
return super.shouldInterceptRequest(view,url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view,String url) {
boolean a = true;
if (url !=null && url.startsWith("whatsapp")){
view.getContext().startActivity(new Intent(Intent.ACTION_VIEW,Uri.parse(url)));
return true;
}
else if (url.startsWith("tel:")) {
Intent intent = new Intent(Intent.ACTION_DIAL,Uri.parse(url));
startActivity(intent);
}
else if (url.startsWith("rate:")) {
final String app_package = getPackageName(); //requesting app package name from Context or Activity object
try {
startActivity(new Intent(Intent.ACTION_VIEW,Uri.parse("market://details?id=" + app_package)));
} catch (ActivityNotFoundException anfe) {
startActivity(new Intent(Intent.ACTION_VIEW,Uri.parse("https://play.google.com/store/apps/details?id=" + app_package)));
}
}
else if (url.startsWith("share:")) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT,view.getTitle());
intent.putExtra(Intent.EXTRA_TEXT,view.getTitle()+"\nVisit: "+(Uri.parse(url).toString()).replace("share:",""));
startActivity(Intent.createChooser(intent,getString(R.string.share_w_friends)));
}
else if (url.startsWith("exit:")) {
exitApp();
}// opening external URLs in android default web browser
else if (ext_url && !hostname(url).equals(homeUrl)) {
Wview(url,true,wError_counter);
// else return false for no special action
} else {
a = false;
}
return a;
}
@Override
public void onPageFinished(WebView view,String url) {
if(!errorOccured){
findViewById(R.id.welcome).setVisibility(View.GONE);
findViewById(R.id.webView).setVisibility(View.VISIBLE);
}
super.onPageFinished(view,url);
}
@Override
public void onReceivedHttpError(WebView view,WebResourceRequest request,WebResourceResponse errorResponse) {
super.onReceivedHttpError(view,request,errorResponse);
}
@Override
public void onReceivedError(WebView view,WebResourceError error) {
errorOccured=true;
findViewById(R.id.webView).setVisibility(View.GONE);
findViewById(R.id.welcome).setVisibility(View.VISIBLE);
//Intent intent = new Intent(getApplicationContext(),ErrorActivity.class);
// startActivity(intent);
}
}
//Random ID creation function to help get fresh cache every-time webview reloaded
public String random_id() {
return new BigInteger(130,random).toString(32);
}
//Opening URLs inside webview with request
void Wview(String url,Boolean tab,int error_counter) {
if(error_counter > 2){
wError_counter = 0;
exitApp();
}else {
if(tab){
if(cTAB) {
CustomTabsIntent.Builder intentBuilder = new CustomTabsIntent.Builder();
intentBuilder.setToolbarColor(ContextCompat.getColor(this,R.color.colorPrimary));
intentBuilder.setSecondaryToolbarColor(ContextCompat.getColor(this,R.color.colorPrimaryDark));
intentBuilder.setStartAnimations(this,android.R.anim.slide_in_left,android.R.anim.slide_out_right);
intentBuilder.setExitAnimations(this,android.R.anim.slide_out_right);
CustomTabsIntent customTabsIntent = intentBuilder.build();
try {
customTabsIntent.launchUrl(MainActivity.this,Uri.parse(url));
} catch (ActivityNotFoundException e) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
}
}else{
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
}
} else {
if (url.contains("?")) { // check to see whether the url already has query parameters and handle appropriately.
url += "&";
} else {
url += "?";
}
url += "rid=" + random_id();
Wview.loadUrl(url);
}
}
}
//Getting host name
public static String hostname(String url){
if (url == null || url.length() == 0) {
return "";
}
int dslash = url.indexOf("//");
if (dslash == -1) {
dslash = 0;
} else {
dslash += 2;
}
int end = url.indexOf('/',dslash);
end = end >= 0 ? end : url.length();
int port = url.indexOf(':',dslash);
end = (port > 0 && port < end) ? port : end;
Log.w("URL Host: ",url.substring(dslash,end));
return url.substring(dslash,end);
}
private void exitApp() {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
// Creating exit dialogue
public void ask_exit(){
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle(getString(R.string.exit_title));
builder.setMessage(getString(R.string.exit_subtitle));
builder.setCancelable(true);
// Action if user selects 'yes'
builder.setPositiveButton("Yes",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface,int i) {
finish();
}
});
// Actions if user selects 'no'
builder.setNegativeButton("No",int i) {
}
});
// Create the alert dialog using alert dialog builder
AlertDialog dialog = builder.create();
// display the dialog when user press back button
dialog.show();
}
@Override
public void onBackPressed() {
if (Wview.canGoBack()) {
Wview.goBack();
} else if (ask_ExitDial) {
ask_exit();
} else {
super.onBackPressed();
this.finish();
}
}
private class chromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view,int newProgress) {
Wview.loadUrl("javascript:(function() { " +
"document.getElementsByClassName('sc-iQKALj cdqULD border border-gray-dae')[0].style.display='none'; " +
"})()");
super.onProgressChanged(view,newProgress);
}
}
private class touchlistener implements View.OnTouchListener {
@Override
public boolean onTouch(View view,MotionEvent motionEvent) {
WebView.HitTestResult hitTestResult=((WebView)view).getHitTestResult();
hitResult=true;
return false;
}
}
}
解决方法
所以基本上,问题是要检测WebView内部的更改并以特定的方式对其进行反应。
WebView
内的更改可以有多种类型-实际的重新加载和Dom更改-是我们应该听的主要内容。尽管监听重装相对容易,并且可以在WebViewClient.shouldInterceptRequest
或WebViewClient.shouldOverrideUrlLoading
回调中完成,但无法通过android WebView
API来跟踪DOM更改。
private class myClient extends WebViewClient {
...
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view,String url) {
Wview.evaluateJavascript("javascript:(function() { " +
"document.getElementsByClassName('sc-iQKALj cdqULD border border-gray-dae')[0].style.display='none'; " +
"})()");
return super.shouldInterceptRequest(view,url);
}
...
}
要跟踪DOM中的更改,我们可以使用JavaScript,特别是MutationObserver
-您必须通过WebView
js注入功能将代码与实现的回调一起注入。为此,如果您的最低API级别高于19,请尝试使用webView.evaluateJavascript
而不是webView.loadUrl
。
您也可以使用Activity.onBackPressed
方法和WebView.setOnKeyListener
结合词。看起来像这样:
public void onBackPressed() {
if (Wview.canGoBack()) {
Wview.goBack();
Wview.evaluateJavascript("javascript:(function() { " +
"document.getElementsByClassName('sc-iQKALj cdqULD border border-gray-dae')[0].style.display='none'; " +
"})()");
} else if (ask_ExitDial) {
ask_exit();
} else {
super.onBackPressed();
this.finish();
}
}
Wview.setOnKeyListener((View.OnKeyListener) (v,keyCode,event) -> {
if (event.getAction() != KeyEvent.ACTION_DOWN)
return true;
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (Wview.canGoBack()) {
Wview.goBack();
Wview.evaluateJavascript("javascript:(function() { " +
"document.getElementsByClassName('sc-iQKALj cdqULD border border-gray-dae')[0].style.display='none'; " +
"})()");
} else {
((Activity) this).onBackPressed();
}
return true;
}
return false;
});
它可能行不通,具体取决于您的网站体系结构。
因此,您唯一的选择是进行试验,并希望它会起作用。通常在android上使用webview是一件很痛苦的事,所以...是的。
希望它会以某种方式帮助您。
,您可以使用 onPageFinished 方法执行JavaScript代码以隐藏按钮。
在onPageFinished方法内部使用此代码
Wview.evaluateJavascript("javascript:(function() { " +
"document.getElementsByClassName('sc-iQKALj cdqULD border border-gray-dae')[0].style.display='none'; " +
"})()");
注意:您还可以在onPageFinished方法中放置if语句,以检查当前URL是否与所需的URL模式匹配。