如何在 Fragment 中打开一个 Activity 的 WebView Link?

How To Make A WebView Link In Fragment Open An Activity?

我在片段中有一个 webview,该 webview 有多个 link。我希望当用户单击其中一个 link 时,例如阅读更多 link,它会打开我创建的应用内浏览器 (BrowserActivity)。我怎样才能做到这一点?

BrowserActivity.java

public class BrowserActivity extends AppCompatActivity {

private String Url ;
private WebView Tecwebview;
private ProgressBar progressBar;
ImageButton back, forward, stop, refresh, homeButton;

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

    back = (ImageButton) findViewById(R.id.back_arrow);
    forward = (ImageButton) findViewById(R.id.forward_arrow);
    stop = (ImageButton) findViewById(R.id.stop);
    refresh = (ImageButton) findViewById(R.id.refresh);
    homeButton = (ImageButton) findViewById(R.id.home);
    progressBar = (ProgressBar) findViewById(R.id.probar);
    progressBar.setMax(100);
    Tecwebview = (WebView) findViewById(R.id.tecwebview);

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


    Tecwebview.loadUrl(Url);

    if (savedInstanceState != null) {
        Tecwebview.restoreState(savedInstanceState);
    } else {
        Tecwebview.getSettings().setJavaScriptEnabled(true);
        Tecwebview.getSettings().setUseWideViewPort(true);
        Tecwebview.getSettings().setLoadWithOverviewMode(true);
        Tecwebview.getSettings().setSupportZoom(true);
        Tecwebview.getSettings().setSupportMultipleWindows(true);
        Tecwebview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);


        Tecwebview.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
                progressBar.setProgress(newProgress);
                if (newProgress < 100 && progressBar.getVisibility() == ProgressBar.GONE) {
                    progressBar.setVisibility(ProgressBar.VISIBLE);
                }
                if (newProgress == 100) {
                    progressBar.setVisibility(ProgressBar.GONE);
                } else {
                    progressBar.setVisibility(ProgressBar.VISIBLE);
                }
            }
        });
    }


    Tecwebview.setWebViewClient(new MyWebViewClient());

    back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (Tecwebview.canGoBack()) {
                Tecwebview.goBack();
            }
        }
    });
    forward.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (Tecwebview.canGoForward()) {
                Tecwebview.goForward();
            }
        }
    });

    stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Tecwebview.stopLoading();
        }
    });

    refresh.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Tecwebview.reload();
        }
    });
    homeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Tecwebview.loadUrl("https://google.com");
        }
    });
}

private class MyWebViewClient extends WebViewClient {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        progressBar.setVisibility(View.VISIBLE);
        super.onPageStarted(view, url, favicon);
    }


    @Override
    public void onPageFinished(WebView view, String url) {
        progressBar.setVisibility(View.GONE);
        super.onPageFinished(view, url);
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.browser, menu);
    return true;
}

片段

public class NewsFragment extends Fragment {

private WebView Tecwebview;

public NewsFragment() {

}


LinearLayout Weblinearlayout;
SwipeRefreshLayout Webswipelayout;
ProgressBar progressBar;
String url = "http://someweb.com/news/";



@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable
        Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.fragment_home, container, false);
    Tecwebview = (WebView) v.findViewById(R.id.tecwebview);
    progressBar = (ProgressBar) v.findViewById(R.id.probar);
    Weblinearlayout = v.findViewById(R.id.layout);
    Webswipelayout = v.findViewById(R.id.swipe);
    progressBar.setMax(100);
    WebSettings Websettings = Tecwebview.getSettings();
    Websettings.setJavaScriptEnabled(true);
    Tecwebview.setWebViewClient(new WebViewClient());
    Tecwebview.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {
            progressBar.setProgress(progress);
            if (progress < 100 && progressBar.getVisibility() == ProgressBar.GONE) {
                progressBar.setVisibility(ProgressBar.VISIBLE);
                Tecwebview.setVisibility(View.GONE);
            }

            if (progress == 100) {
                progressBar.setVisibility(ProgressBar.GONE);
                Tecwebview.setVisibility(View.VISIBLE);
            }
        }
    });

    Webswipelayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            Tecwebview.reload();
            LoadWeb();
        }
    });

    Tecwebview.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
            if (Tecwebview.getScrollY()==0){
                Webswipelayout.setEnabled(true);
            } else {
                Webswipelayout.setEnabled(false);
            }
        }
    });

    Tecwebview.setWebViewClient(new HomeFragment.MyCustomWebViewClient(){


        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Weblinearlayout.setVisibility(View.VISIBLE);
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            Weblinearlayout.setVisibility(View.GONE);
            Webswipelayout.setRefreshing(false);
            super.onPageFinished(view, url);
        }
    });


    LoadWeb();


    // This code if for the on back press within webview
    Tecwebview.canGoBack();
    Tecwebview.setOnKeyListener(new View.OnKeyListener() {

        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK
                    && event.getAction() == MotionEvent.ACTION_UP
                    && Tecwebview.canGoBack()) {
                Tecwebview.goBack();
                return true;
            }
            return false;
        }
    });





    return v;

}





public void LoadWeb() {
    Tecwebview.loadUrl(url);
    Webswipelayout.setRefreshing(true);
}

这是为了浏览器 activity 使 link 在浏览器中 activity webview 仅在 webview

中打开
public class MyWebViewClient extends WebViewClient {

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    view.loadUrl(url);
    CookieManager.getInstance().setAcceptCookie(true);
    return true;
}

据我了解,您有一个 url,例如 www.xyz.com,您希望在用户点击时加载 Activity它。 如果是这样,那么请尝试使用以下代码,但将 targeUrl 的值更改为您的 link 地址,并在我写评论的区域启动 activity...

Tecwebview.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        String targetUrl = "https//www.somelinksaddress.com/me/you";
        if (targetUrl.equals(url)) {
            // Start your activity here
        } else {
            view.loadUrl(url);
        }
        return true;
    }
});