martes, 11 de agosto de 2015

Android: Webview


Make links open in my webview rather than default browser:

private void setLinks(View view) {

        String linksAsText = getLinksAsText();

        linksContainerView = view.findViewById(R.id.links_container);
        linksContainerView.setVisibility(linksAsText.isEmpty() ? View.GONE : View.VISIBLE);

        linksTextView = (TextView) view.findViewById(R.id.links);
        linksTextView.setText(linksAsText);
        linksTextView.setMovementMethod(LinkMovementMethod.getInstance());
        linksTextView.setLinksClickable(true);
        setTextViewHTML(linksTextView, getLinksAsText());
    }

private String getLinksAsText() {

        StringBuilder builder = new StringBuilder();

        for (String link : feed.getLinks()){
            builder.append("<br>");
            builder.append("<html>");
            builder.append("<a href=\"");
            builder.append(link);
            builder.append("\">");
            builder.append(link);
            builder.append("</a></html>");
        }

        String linksText = builder.toString();

        return linksText.isEmpty() ? "" : linksText.substring(4);
    }


private void setTextViewHTML(TextView text, String html)
    {
        CharSequence sequence = Html.fromHtml(html);
        SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
        URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);

        for(URLSpan span : urls) {
            makeLinkClickable(strBuilder, span);
        }

        text.setText(strBuilder);
    }

    private void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span)
    {
        int start = strBuilder.getSpanStart(span);
        int end = strBuilder.getSpanEnd(span);
        int flags = strBuilder.getSpanFlags(span);

        ClickableSpan clickable = new ClickableSpan() {
            public void onClick(View view) {
                openUrlInWebView(span);
            }
        };
        strBuilder.setSpan(clickable, start, end, flags);
        strBuilder.removeSpan(span);
    }

    private void openUrlInWebView(URLSpan span) {
        Bundle bundle = new Bundle();
        bundle.putString(WebViewFragment.URL, span.getURL());

        WebViewFragment fragment = new WebViewFragment();
        fragment.setArguments(bundle);

        getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).addToBackStack(null).commit();
    }
WebViewFragment class
public class WebViewFragment extends BaseFragment {


    public static String URL = "url";

    private WebView webView;
    private ProgressDialog progressDialog;
    private int counter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        progressDialog = new ProgressDialog(getActivity());
        progressDialog.setMessage(getString(R.string.loading));
    }

    @Override
    public void onPause() {
        super.onPause();
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_video_tour, null);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        webView = (WebView) view.findViewById(R.id.webview);

        startWebView(getArguments().getString(URL));
    }

    private void startWebView(String url) {

        webView.setWebViewClient(new WebViewClient() {

            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);

                counter++;

                if (!progressDialog.isShowing()) {
                    progressDialog.show();
                }
            }

            public void onPageFinished(WebView view, String url) {

                counter--;

                if (counter == 0) {
                    progressDialog.dismiss();
                }
            }

        });

        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setLoadWithOverviewMode(true);
        webView.getSettings().setUseWideViewPort(true);

        // Other webview options
        /*
        webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        webView.setScrollbarFadingEnabled(false);
        webView.getSettings().setBuiltInZoomControls(true);
        */

        webView.loadUrl(url);
    }
}
WebViewFragment layout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>
Usage
Bundle bundle = new Bundle();
bundle.putString(VideoTourFragment.URL, <string_URL>);

VideoTourFragment fragment = new VideoTourFragment();
fragment.setArguments(bundle);

No hay comentarios:

Publicar un comentario