今天简单那的了解了1下WebView
大致分为两种情况: 1 在fragment 中 2 在Activity
1 在Fragment中的 WebView Client 点击回退是个难点
解决回退的方法Code:
原理很简单: 就是监听 Fragment 当前的事件, 但按下的时候,看是否是回退键,WebView是不是可以回退?
可以的话,直接回退!
//设置 WebView 内部的回退跳转:
webView.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(event.getAction() == KeyEvent.ACTION_DOWN)
{
if(keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack())
{
webView.goBack();
return true;
}
}
return false;
}
});
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
package com.cim.pd.ui.fragment;
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
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.ViewGroup;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.ProgressBar;
import com.cim.pd.R;
import com.cim.pd.ui.MainActivity;
import com.cim.pd.view.MyWebViewClient;
/**
* 菜单栏:
* 购买希盟智能装备页面
*
* @author Hades
* @Time 2014⑴2⑷
*
*/
public class BuyDeviceFragment extends Fragment {
public static final String ARG = "BuyDeviceFragment";
private MainActivity mainActivity;
/**
* 购买装备的WebView
* */
private WebView webView;
/**
* 进度条
* */
private ProgressBar progressBar;
@Override
public void onAttach(Activity activity)
{
super.onAttach(activity);
mainActivity = (MainActivity) activity;
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.fragment_buy_device, container, false);
initTop(view);
initWebView(view);
return view;
}
/**
* 初始化顶部的信息
*
* @author Hades
* @Time 2014⑴2⑷
* @param view
*/
private void initTop(View view)
{
progressBar = (ProgressBar) view.findViewById(R.id.buy_progressBar);
progressBar.setVisibility(View.VISIBLE);
ImageView drawerView = (ImageView)view.findViewById(R.id.drawer_menu);
//设置监听器:
drawerView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mainActivity.toggle();
}
});
}
/**
* 初始化页面信息:
*
* @author Hades
* @Time 2014⑴2⑷
* @param view
*/
private void initWebView(View view)
{
webView = (WebView)view.findViewById(R.id.buy_webview);
webView.getSettings().setJavaScriptEnabled(true);
String url = "http://m.cim120.com/";
//第1步: 直接加载网址
webView.loadUrl(url);
//第2步: 设置页面在当前的WebView 中跳转!
MyWebViewClient client = new MyWebViewClient(mainActivity,progressBar);
webView.setWebViewClient(client);
//设置 WebView 内部的回退跳转:
webView.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(event.getAction() == KeyEvent.ACTION_DOWN)
{
if(keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack())
{
webView.goBack();
return true;
}
}
}
});
}
@Override
public void onDestroyView() {
// TODO Auto-generated method stub
super.onDestroyView();
}
}
2 Activity
/**
* 初始化组件
*
* @Hades
* @Dec 3, 2014
* @11:35:35 PM
*/
private void init() {
webView = (WebView) this.findViewById(R.id.my_buy_webview);
webView.getSettings().setJavaScriptEnabled(true);
String url = "http://m.cim120.com/";
//第1种方式: 直接加载
webView.loadUrl(url);
//第2种: 创建自己的 阅读器!搜友的数据信息在里面显示!
MyWebViewClient client = new MyWebViewClient(BuyDeviceActivity.this,progressBar);
webView.setWebViewClient(client);
}
/**
* 设置WebViewClient 内部的回退
*/
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
if(webView.canGoBack())
{
webView.goBack();
}else{
finish();
}
}
Activity 内部有1个监听 回退键的 回调方法。
onBAckPressed;
---------------------------------------------------------------------------------------------------------------------------------
webView 中的 webView.getSettings().setJavaScriptEnabled(true);
这是添加 Js 的支持, 如果没有这句话的话,就会致使 webView 加载的页面中,
JS的殊效,没法显示!
-------------------------------------------------------------------------------------------------------------------------------
今天有的小大意:
跳转BuyDeviceActivity的时候
点击的时候, 怎样还保存数据了?
Error:
12-04 13:51:19.778: E/CrashHandler(19281): Caused by: libcore.io.ErrnoException: write failed: ENOSPC (No space left on device)
缘由是由于: 自己太大意了! 没有添加 在 Application 中注册 Activity!
------------------------------------------------------------------------------------------------------------------------
WebViewClient是 用来显示WebView 的内容的数据;
如果没有他的话,当你点击啊WebView内部的内容的时候,就会默许的开启1个Intent去调用本地的
阅读器的App。
所以 必须自定义 WebViewClient,
shouldOverrideUrlLoading 是必须重写的。
package com.example.webview;
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
public class MyWebViewClient extends WebViewClient {
private ProgressBar progressBar;
public MyWebViewClient() {
// TODO Auto-generated constructor stub
}
public MyWebViewClient(Activity context) {
// TODO Auto-generated constructor stub
super();
}
public MyWebViewClient(Activity context,ProgressBar progressBar) {
// TODO Auto-generated constructor stub
super();
this.progressBar = progressBar;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
view.loadUrl(url);
return true;
}
/**
* WebView加载终了数据
* */
@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
// super.onPageFinished(view, url);
progressBar.setVisibility(View.GONE);
}
}
onPageFinished()是在 WebView加载成功以后调用的,
这里 可以设置 进度条为 gone!
让进度条消失。