package com.mgw.member.ui.fragment; import java.util.Map; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnKeyListener; import android.view.View.OnLongClickListener; import android.webkit.JavascriptInterface; import android.webkit.WebView; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.mgw.member.R; import com.mgw.member.bean.WebViewInfo; import com.mgw.member.factory.MgwWebViewFactory; import com.mgw.member.js.dao.JsCnative; import com.mgw.member.manager.BaseApplication; import com.mgw.member.ottoEvent.BusProvider; import com.mgw.member.ottoEvent.MallFragmentNeedRefreshEvent; import com.mgw.member.ui.activity.MGWBaseActivity; import com.mgw.member.ui.activity.MainActivity; import com.mgw.member.ui.activity.SubWebviewActivity; import com.mgw.member.ui.activity.WebviewActivity; import com.mgw.member.uitls.LogUtils; import com.mgw.member.uitls.NetworkProber; import com.mgw.member.uitls.UIUtils; import com.mgw.member.uitls.ViewUtils; import com.squareup.otto.Subscribe; /** * * 商城 * * * * @author huyan */ public class MallFragment extends BaseFragment implements OnClickListener { private final String TAG = MallFragment.class.getSimpleName().toString(); // private WebView webview = null; private String defaultUrl = ""; /** * webview容器 */ private FrameLayout fl_webviews; private RelativeLayout errorPage; private TextView mainpage; private LinearLayout layout; private TextView back; private TextView top_title; private String proTitle = ""; private String currentUrl = ""; private String parentPageValue = ""; private boolean isContainParentPageValue = false; private int currentProgr = 0; public Boolean isErrorPage; // <input name="parentPage" /> @SuppressLint({ "NewApi", "JavascriptInterface" }) @Override public View initView(LayoutInflater inflater) { LogUtils.i(TAG + "initView"); View view = UIUtils.inflate(R.layout.fragment_mall); fl_webviews = (FrameLayout) view.findViewById(R.id.fl_webviews); errorPage = (RelativeLayout) view.findViewById(R.id.error_layout); mainpage = (TextView) view.findViewById(R.id.mainpage); layout = (LinearLayout) view.findViewById(R.id.layout); back = (TextView) view.findViewById(R.id.back); top_title = (TextView) view.findViewById(R.id.title); back.setOnClickListener(this); mainpage.setOnClickListener(this); mainpage.setVisibility(View.GONE); layout.setVisibility(View.VISIBLE); back.setVisibility(View.GONE); top_title.setVisibility(View.VISIBLE); mWebViewFactory = MgwWebViewFactory.getInstance(context); view.findViewById(R.id.refresh).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { handler.sendEmptyMessage(MESSAGE_TYPE_WEBPAGER_REFRESH); } }); final WebView webView = mWebViewFactory.createSubWebView(true, context); webView.addJavascriptInterface(new Handle(), JsCnative.mgwjs); webViewSetting(webView, new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { // 能后退 没有包含根标签 if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack() && !isContainParentPageValue) { // webView.clearHistory(); return false; // 已处理 } else if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack() && isContainParentPageValue) { // // webview.clearHistory(); // return false; // 已处理 webView.loadUrl(parentPageValue); return true; // 已处理 } } return false; } }); // id.webkit.WebView{42b2dd80 VFEDHVC. ......I. 0,0-0,0} // id.webkit.WebView{42ab0438 VFED..C. .F...... 0,0-1080,1653 #7f0a00fc // app:id/webView} webView.setWebViewClient(new MyWebViewClient_Mall()); webView.setWebChromeClient(new MyWebChromeClient_Mall()); defaultUrl = getActivity().getSharedPreferences("mgw_data", 0).getString("mgw_mall", "http://www.baidu.com"); // http://Androidweb.mgw.cc/default.aspx?type=2&a=UxGmse1%2fhNgKbXvVQCmzaigGVcBKYBo5 webView.loadUrl(defaultUrl); LogUtils.i(TAG + "initView,webview.hashcode=" + webView.hashCode()); WebViewInfo viewInfo = mWebViewFactory.createSubWebViewInfo(webView); viewInfo.isRootPage = true; mWebViewFactory.addToMall2(viewInfo); if (mWebViewFactory.getBottomWebView_mall2().getmWebView() != null) { ViewUtils.removeSelfFromParent(mWebViewFactory.getBottomWebView_mall2().getmWebView()); } fl_webviews.addView(mWebViewFactory.getBottomWebView_mall2().getmWebView()); return view; } /** * * js操作本地接口类 * * * * @author huyan * * */ public class Handle implements JsCnative { @JavascriptInterface public void showSource(final String data) { Map<String, String> map = parseHtml2GetParentValue(data); parentPageValue = map.get("parentPage"); isContainParentPageValue = !(parentPageValue == ""); isErrorPage = map.get("errorPage") == "yes"; mWebViewFactory.getCurrentWebView_mall2().isRootPage = !isContainParentPageValue; showAndHideBack(mWebViewFactory.getCurrentWebView_mall2().isRootPage); if (isErrorPage) { handler.sendEmptyMessage(MESSAGE_TYPE_WEBPAGER_ERROR); } else { handler.sendEmptyMessage(MESSAGE_TYPE_WEBPAGER_OK); } LogUtils.i(TAG, "showSource="); } @Override @JavascriptInterface public void getUserInfo() { return; } @Override @JavascriptInterface public void transferTo(String url, String parm) { } @Override @JavascriptInterface public void setClientInfo(String groupid, String uid, String sid) { } @Override @JavascriptInterface public void toConsulter(String userid) { // TODO Auto-generated method stub } @Override @JavascriptInterface public void toSupplier(String sid) { // TODO Auto-generated method stub } @Override @JavascriptInterface public void buyInSupplier(String sid, String pid) { // TODO Auto-generated method stub } } /** * * js消息处理handler */ private Handler handler = new Handler() { @Override public void handleMessage(android.os.Message msg) { if (msg.what == MESSAGE_TYPE_WEBPAGER_ERROR) { // Toast.makeText(context, "errorpage", 0).show(); errorPage.setVisibility(View.VISIBLE); // top_title.setText("找不到网页"); } else if (msg.what == MESSAGE_TYPE_WEBPAGER_REFRESH) { // TODO mWebViewFactory.getCurrentWebView_mall2().getmWebView().loadUrl(currentUrl); } else if (msg.what == MESSAGE_TYPE_WEBPAGER_OK) { errorPage.setVisibility(View.GONE); } } }; @Override public void initData() { } @Override public void showTwoPage(WebView view, String url) { mWebViewFactory.showUrl2OhterWebView(view, url, new MyWebViewClient_Mall(), TAG); } @Override public void hideErrorPage() { mWebViewFactory.goBackfromOhterWebview(TAG, fl_webviews); } @Override public void open2OhterActivitye(Intent intent) { if (intent == null) return; // startActivity(intent); startActivityForResult(intent, 22); } @Override public void open2OhterActivitye(Intent intent, boolean forResut) { if (intent == null) return; if (forResut) { startActivityForResult(intent, 22); } else { startActivity(intent); } } /** * 显示隐藏back键和home键 * * @param isRootPage * Created by Administrator */ private void showAndHideBack(final boolean isRootPage) { UIUtils.runInMainThread(new Runnable() { @Override public void run() { if (isRootPage) { mainpage.setVisibility(View.GONE); back.setVisibility(View.GONE); } else { back.setVisibility(View.VISIBLE); mainpage.setVisibility(View.VISIBLE); } } }); } @Override protected void openWebview(WebView view, String url) { view.loadUrl(url); } private boolean isRootURl; public class MyWebViewClient_Mall extends BaseWebViewClient { @Override public void onPageFinished(WebView view, String url) { // 通过内部类定义的方法获取html页面加载的内容,这个需要添加在webview加载完成后的回调中 // view.loadUrl("javascript:window.handler.show(document.body.innerHTML);"); view.loadUrl("javascript:window.mgwjs.showSource('<head>'+" + "document.getElementsByTagName('html')[0].innerHTML+'</head>');"); dismissLoadingDialog(); LogUtils.i(TAG, "onPageFinished=" + "url=" + url); currentProgr = 0; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { LogUtils.i(TAG, "onPageStarted=" + "url=" + url); if (MainActivity.mainActivity == null) { return; } String aa = MainActivity.mainActivity.getSharedPreferences("mgw_data", 0).getString("mgw_mall", "http://www.baidu.com"); // [104, 116, 116, 112, 58, 47, 47, 65, 110, 100, 114, 111, 105, // [104, 116, 116, 112, 58, 47, 47, 97, 110, 100, 114, 111, 105, if (url.length() > 60 && (url.substring(10).equals(aa.substring(10)))) { isRootURl = true; LogUtils.i(TAG, "onPageStarted=" + "isRootURlm(true),url=" + url); } else { currentUrl = url; isRootURl = false; LogUtils.i(TAG, "onPageStarted=" + "isRootURlm(false),url=" + url); } } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (!NetworkProber.isNetworkAvailable(context)) { view.stopLoading(); UIUtils.showToastSafe(R.string.network_isnot_available); return true; } if ((MGWBaseActivity) getActivity() != null) { ((MGWBaseActivity) getActivity()).beepManager.playBeepSoundAndVibrate(); } // if (Utils.isFastDoubleClick()) { // return true; // } // 跳转到登录页面 if (url.contains("goto:login")) { view.stopLoading(); if (mShowExit) return true; mShowExit = true; { view.stopLoading(); BaseApplication.getApplication().logout(context); mShowExit = false; } return true; } // 含有键值对,不加载,直接跳转 // if (url.contains("?id=") || url.contains("?key=")) { // [104, 116, 116, 112, 58, 47, 47, 65, 110, 100, 114, 111, 105, // [104, 116, 116, 112, 58, 47, 47, 97, 110, 100, 114, 111, 105, // 防止重新点击 if (mWebViewFactory.getCurrentWebView_mall2() != null && mWebViewFactory.getCurrentWebView_mall2().getUrl().equals(url)) { return true; } if (isRootURl) { LogUtils.i(TAG, "shouldOverrideUrlLoading=" + "isRootURlm(true),url=" + url); view.loadUrl(url); mWebViewFactory.getBottomWebView_mall2().setUrl(url); showLoadingDialog(getActivity(), MallFragment.class); return true; } else { LogUtils.i(TAG, "shouldOverrideUrlLoading=" + "mWebViewFactory.getBottomWebView_mall2().getUrl();" + mWebViewFactory.getBottomWebView_mall2().getUrl()); LogUtils.i(TAG, "shouldOverrideUrlLoading=" + "isRootURlm(false),url=" + url); // http://androidweb.mgw.cc/default.aspx?type=2&a=UxGmse1%2fhNiyAg7Ha%2fT7w5%2fnfLMpK69X // http://androidweb.mgw.cc/default.aspx?type=2&a=UxGmse1%2fhNiyAg7Ha%2fT7w5%2fnfLMpK69X if (url.contains("?id=") && !url.contains("&style")) { // http://androidweb.mgw.cc/AppMalls/BrandsShow.aspx view.stopLoading(); Intent intent = new Intent(context, SubWebviewActivity.class); intent.putExtra("url", url); intent.putExtra("type", 1); open2OhterActivitye(intent, false); return true; } else { view.stopLoading(); // http://androidweb.mgw.cc/AppMalls/BrandsShow.aspx // http://androidweb.mgw.cc/AppMalls/BrandsShow.aspx WebViewInfo fromUrl_mall2 = mWebViewFactory.getWebViewFromUrl_mall2(url); if (fromUrl_mall2 != null && fromUrl_mall2.getmWebView() != null) { fromUrl_mall2.setUrl(url); ViewUtils.removeSelfFromParent(fromUrl_mall2.getmWebView()); fl_webviews.addView(fromUrl_mall2.getmWebView()); fl_webviews.removeView(mWebViewFactory.getCurrentWebView_mall2().getmWebView()); mWebViewFactory.add2Top(fromUrl_mall2, MallFragment.class); } else { WebView webview = new WebView(context); webview.setWebViewClient(new MyWebViewClient_Mall()); webview.setWebChromeClient(new MyWebChromeClient_Mall()); webViewSetting(webview, null); webview.addJavascriptInterface(new Handle(), JsCnative.mgwjs); WebViewInfo viewInfo = new WebViewInfo(webview); viewInfo.setUrl(url); mWebViewFactory.add2Top(viewInfo, MallFragment.class); webview.loadUrl(url); fl_webviews.addView(mWebViewFactory.getCurrentWebView_mall2().getmWebView()); fl_webviews.removeView(mWebViewFactory.getPreviousWebView_mall2(mWebViewFactory.getCurrentWebView_mall2()).getmWebView()); showLoadingDialog(getActivity(), MallFragment.class); } return true; } } } } public class MyWebChromeClient_Mall extends BaseWebChromeClient { @Override public void onProgressChanged(WebView view, int newProgress) { currentProgr = newProgress; if (newProgress > 51) { dismissLoadingDialog(); } } @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); top_title.setText(title); WebViewInfo fromUrl_mall2 = mWebViewFactory.getWebViewInfoFromWebView_mall2(view); if (fromUrl_mall2 != null) { fromUrl_mall2.setTopTitle(title); LogUtils.i(TAG, "onReceivedTitle=" + "title=" + title + "d" + fromUrl_mall2.isRootPage); } } } @Override public void onResume() { super.onResume(); if (dialog != null && dialog.isShowing()) { dialog.dismiss(); dialog = null; } BusProvider.getInstance().register(this); } @Override public void onPause() { // TODO Auto-generated method stub super.onPause(); BusProvider.getInstance().unregister(this); } @Override public boolean onBackPressed() { LogUtils.i(TAG + "onBackPressed"); if (errorPage.getVisibility() == View.VISIBLE) { if (mWebViewFactory.getMallWebinfoSize().size() > 1) { hideErrorPage(); errorPage.setVisibility(View.GONE); return true; } } if (mWebViewFactory.getCurrentWebView_mall2().isRootPage) { return false; } // 处理fragment中的back时间 if (mWebViewFactory.getMallWebinfoSize().size() > 1) { hideErrorPage(); showAndHideBack(mWebViewFactory.getCurrentWebView_mall2().isRootPage); top_title.setText(mWebViewFactory.getCurrentWebView_mall2().getTopTitle()); if (errorPage.getVisibility() == View.VISIBLE) { errorPage.setVisibility(View.GONE); } return true; } return false; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); LogUtils.i(TAG + "onActivityResult,requestCode=" + requestCode); if (resultCode == Activity.RESULT_OK) { Bundle bundle = data.getExtras(); String scanResult = bundle.getString("result"); Intent intent = new Intent(context, WebviewActivity.class); intent.putExtra("url", scanResult); startActivity(intent); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.back: onBackPressed(); break; case R.id.mainpage: // 跳至主页 while (!mWebViewFactory.getCurrentWebView_mall2().isRootPage) { onBackPressed(); } mWebViewFactory.getCurrentWebView_mall2().getmWebView().reload(); break; default: break; } } @Override public void onHiddenChanged(boolean hidden) { // TODO Auto-generated method stub super.onHiddenChanged(hidden); if (!hidden) { if (currentProgr != 0 && currentProgr < 50) { showLoadingDialog(getActivity(), MallFragment.class); } } } }