package com.example.fragment; import android.annotation.TargetApi; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnKeyListener; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.webkit.WebChromeClient; import android.webkit.WebResourceError; import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; import com.example.R; import org.alfonz.view.StatefulLayout; public class ExampleFragment extends Fragment { private View mRootView; private StatefulLayout mStatefulLayout; private String mUrl = "about:blank"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mRootView = inflater.inflate(R.layout.fragment_example, container, false); return mRootView; } private void bindData() { // reference final WebView webView = (WebView) mRootView.findViewById(R.id.fragment_example_webview); // webview settings webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setAppCacheEnabled(true); webView.getSettings().setAppCachePath(getActivity().getCacheDir().getAbsolutePath()); webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); webView.getSettings().setDomStorageEnabled(true); webView.getSettings().setDatabaseEnabled(true); webView.getSettings().setGeolocationEnabled(true); webView.getSettings().setSupportZoom(true); webView.getSettings().setBuiltInZoomControls(false); // webview style webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); // fixes scrollbar on Froyo // webview hardware acceleration if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); } else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } // webview chrome client webView.setWebChromeClient(new WebChromeClient()); // http://stackoverflow.com/questions/8541443/whats-causing-this-nullpointerexception // webview client webView.setWebViewClient(new MyWebViewClient()); // webview key listener webView.setOnKeyListener(new WebViewOnKeyListener()); // webview touch listener webView.requestFocus(View.FOCUS_DOWN); // http://android24hours.blogspot.cz/2011/12/android-soft-keyboard-not-showing-on.html webView.setOnTouchListener(new WebViewOnTouchListener()); // load web url mStatefulLayout.showProgress(); webView.loadUrl(mUrl); } private void controlBack() { final WebView webView = (WebView) mRootView.findViewById(R.id.fragment_example_webview); if(webView.canGoBack()) webView.goBack(); } private void controlForward() { final WebView webView = (WebView) mRootView.findViewById(R.id.fragment_example_webview); if(webView.canGoForward()) webView.goForward(); } private void controlStop() { final WebView webView = (WebView) mRootView.findViewById(R.id.fragment_example_webview); webView.stopLoading(); } private void controlReload() { final WebView webView = (WebView) mRootView.findViewById(R.id.fragment_example_webview); webView.reload(); } private class MyWebViewClient extends WebViewClient { @Override public void onPageFinished(WebView view, String url) { if(getActivity() != null) { Toast.makeText(getActivity(), mUrl, Toast.LENGTH_LONG).show(); mStatefulLayout.showContent(); } } @SuppressWarnings("deprecation") @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { if(getActivity() != null) { final WebView webView = (WebView) mRootView.findViewById(R.id.fragment_example_webview); webView.loadUrl("about:blank"); Toast.makeText(getActivity(), errorCode + ": " + description, Toast.LENGTH_LONG).show(); mStatefulLayout.showEmpty(); } } @TargetApi(Build.VERSION_CODES.M) @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { // forward to deprecated method onReceivedError(view, error.getErrorCode(), error.getDescription().toString(), request.getUrl().toString()); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if(url != null && (url.startsWith("http://") || url.startsWith("https://"))) { view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); return true; } else { return false; } } } private class WebViewOnKeyListener implements OnKeyListener { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if(event.getAction() == KeyEvent.ACTION_DOWN) { WebView webView = (WebView) v; switch(keyCode) { case KeyEvent.KEYCODE_BACK: if(webView.canGoBack()) { webView.goBack(); return true; } break; } } return false; } } private class WebViewOnTouchListener implements OnTouchListener { @Override public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_UP: if(!v.hasFocus()) { v.requestFocus(); } break; } return false; } } }