我检查所有论坛但没有找到解决方案| “在浏览器中打开我的webview的外部链接而不是在应用程序中”不起作用

时间:2017-10-22 10:09:51

标签: android android-studio webview android-webview

感谢您阅读我的问题:)检查完所有论坛后,我无法解决此问题。我正在开发我的第一个webview。没什么特别的。这是一个带进度条的webview。我在“shouldOverrideUrlLoading”方法中的代码不起作用。我希望我的网站的所有外部链接在浏览器中打开而不是在应用程序中打开,但它不起作用。有人可以查看我的代码吗?

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

private WebView wv;
private ProgressBar progressBar;
private FrameLayout frameLayout;
SwipeRefreshLayout swipe;

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

    frameLayout = (FrameLayout) findViewById(R.id.frameLayout);
    progressBar = (ProgressBar) findViewById(R.id.progressBar);
    progressBar.setMax(100);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    swipe = (SwipeRefreshLayout) findViewById(R.id.swipe);
    swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            String webUrl = wv.getUrl();
            wv.loadUrl(webUrl);
        }
    });
    LoadWeb();

}

public void LoadWeb(){

    wv = (WebView)findViewById(R.id.webView);
    WebSettings settings = wv.getSettings();
    settings.setJavaScriptEnabled(true);

    wv.loadUrl("example.com");
    swipe.setRefreshing(true);
    wv.setWebViewClient(new HelpClient());
    wv.setWebViewClient(new MyAppWebViewClient());

    wv.setWebChromeClient(new WebChromeClient(){
        public void onProgressChanged(WebView view, int progress){
            frameLayout.setVisibility(View.VISIBLE);
            progressBar.setProgress(progress);

            if (progress == 100){
                frameLayout.setVisibility(View.GONE);

            }
            super.onProgressChanged(view, progress);
        }
    });
    progressBar.setProgress(0);

    wv.setWebViewClient(new WebViewClient(){

        public void onPageFinished(WebView view, String url){
            swipe.setRefreshing(false);
        }
    });

}

private class HelpClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        view.loadUrl(url);
        frameLayout.setVisibility(View.VISIBLE);
        return true;

    }
}

private class MyAppWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        if(Uri.parse(url).getHost().endsWith("example.com")) {
            return false;
        }
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        view.getContext().startActivity(intent);
        return true;
    }

}

@Override
public void onBackPressed() {
    if(wv.canGoBack()) {
        wv.goBack();
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement


    return super.onOptionsItemSelected(item);
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.nav_home) {
        wv.loadUrl("example.com");

    } else if (id == R.id.nav_facebook) {

        try {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("fb://page/idfbpage"));
            startActivity(intent);
        } catch (Exception e) {
            Intent intent =  new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.facebook.com/idfbpage"));
            startActivity(intent);
        }

    } else if (id == R.id.nav_instagram) {

        Uri uri = Uri.parse("http://instagram.com/_u/idinstapage");
        Intent likeIng = new Intent(Intent.ACTION_VIEW, uri);
        likeIng.setPackage("com.instagram.android");

        try {
            startActivity(likeIng);
        } catch (Exception e) {
            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://instagram.com/idinstapage")));
        }

    } else if (id == R.id.nav_star) {

        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("market://details?id=idpackage"));
        startActivity(intent);

    } else if (id == R.id.nav_informazioni) {
        wv.loadUrl("example.com/info-app");

    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
 }

}

3 个答案:

答案 0 :(得分:2)

在您的方法LoadWeb()中出现错误,因为您的WebView应该只有一个WebViewClient而且只有一个WebChromeClient。所以会发生的情况是,如果你不止一次使用方法wv.setWebViewClient(new YourWebViewClient());,那么之前设置的所有其他方法都会被忽略,因为你只能设置一次。

For你的情况:
您设置WebViewClient三(3)次:

wv.setWebViewClient(new HelpClient());   //First time
wv.setWebViewClient(new MyAppWebViewClient());  //Second time

上次你用同样的方法设置它时,你可以设置另一个:

wv.setWebViewClient(new WebViewClient(){

    public void onPageFinished(WebView view, String url){
        swipe.setRefreshing(false);
    }
});

所以会发生的事情是前两个方法被忽略了,唯一有效的方法是最后一个(第三个)。 这就是为什么我要求你把第二种方法放到setWebClient((new MyAppWebViewClient());以忽略前一种方法!

解决方案
现在您知道我们必须为您的WebViewClient只设置一个webView我们必须只使用 ONE 类来完成所有其他三个WebViewClient private class NewWebViewClient extends WebViewClient { //Now we have only one class to do a job of all the other three! @Override public void onPageFinished(WebView view, String url) { /*I here do whatever you want to do when the page has finished loading! Do it here inside this method and it will work may be control the framelayout visibility For example lets setRefreshing false to our swipe()*/ swipe.setRefreshing(false); //.....add more methods you want here when the page loading is finished } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { /*In this method we are going to tell the android system what kind of link we want and what kind of link we dont want for that what we want we will handle for the extra the browser should do so!*/ if (Uri.parse(url).getHost().endsWith("example.com")) { //if the code gets here this is your link then right? Lets do whatever we want with our link and logic for example lets set framelayout visible or doing anything this link's host is example.com! frameLayout.setVisibility(View.VISIBLE); return false; } else { //Ooops This link is not yours lets just open browsers right Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); view.getContext().startActivity(intent); return true; } } } 1}}通过覆盖所有必需的方法。在你的活动中创建这个类,但是你可以使用任何方法(就像你在HelpClient()Class 中制作时一样)。这是我们的课程请确保您阅读其中的评论!

WebViewClient

在您的课程很漂亮之后,我们只设置wv.setWebViewClient(new NewWebViewClient()); ONCE

WebChromeClient

你可以忽略protected patch(url: string, body: any): Observable<any> { let options = this.getRequestOptions(body); return this.http.patch(this.baseUrl+url,JSON.stringify(body),options); } private getRequestOptions(body:any):RequestOptions{ let cpHeaders = new Headers({ 'Content-Type': 'application/json' }); let options = new RequestOptions({ headers: cpHeaders }); return options; } ,因为你只有在善良时才设置它。如果您发现任何困难,请在下方发表评论!

答案 1 :(得分:0)

我希望删除这一行

wv.setWebViewClient(new MyAppWebViewClient());

将为您解决问题。

答案 2 :(得分:0)

您正在使用两个WebViewClient实例,删除一个,

private class MyAppWebViewClient extends WebViewClient {

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    Log.d("TAG",url);
    if(Uri.parse(url).getHost().equals("example.com")) {
        return false;
    }
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    view.getContext().startActivity(intent);//add the brakpoint here
    Log.d("TAG","Starting activity");
    return true;
}

}

只需使用此