关于Android内置浏览器的问题,在网上找了好多,都说通过canGoBack和canGoForward来判断是否是第一页,或者是最后一页,但是在实际当中,完全不靠谱,当你从第二页回退到第一页时,本应该回退的按钮应该变成灰色,但是此时的canGoBack是true,当再次点击回退时,canGoBack才是变成false,回退按钮才变成灰色,感觉从用户体验上来说,不完美。下面是我写的代码是修复改瑕疵,可能写的不是那么完美。

但进入网页时,回退和前进的按钮都是灰色的,当点击一个连接后进入下一个网页,回退按钮变成亮色,而前进按钮还是灰色的,继续单击进入,回退按钮是亮色,而前进按钮依然是灰色,当点击回退按钮后,回退按钮和前进按钮都变成了亮色,继续点击回退按钮,此时回到第一页,回退按钮变成灰色,前进按钮为亮色;然后我们再点击前进按钮后,进入第二页,前进按钮和后退按钮都变成亮色,继续点击前进按钮,此时前进到第三页,此时的的前进按钮就会变成灰色,而后退按钮是亮色。

我是新手,大家可以任意吐槽哦~~~~~

package com.android.ceshi.webview;
 import java.util.ArrayList;
 import java.util.List;
 
 import com.android.ceshi.R;
 
 import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.app.ProgressDialog;
 import android.content.Intent;
 import android.graphics.Bitmap;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
 import android.util.Log;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.View.OnTouchListener;
 import android.webkit.WebChromeClient;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 import android.widget.ImageButton;
 import android.widget.TextView;
 
 public class WebviewActivity extends Activity{
private String TAG = "MST";

private String url = "";
private WebView mWebView;
private TextView webViewTitle;
private ImageButton mBackButton;
private ImageButton webviewBackBut;
private ImageButton webviewForwardBut;
private ImageButton webviewRefreshBut;
private ProgressDialog mDialog;
private View webview_linearlayout_01, webview_linearlayout_02;

private CountTimeThread mCountTimeThread;

private static final int HIDE_MSG = 0x0001;
private static final int DISS_DIALOG = 0x0002;
private static final int SHOW_DIALOG = 0x0003;
private static final int VIEW_VISIBLE = 0x0004;
private static final int UPDATE_TITLE = 0x0005;
private static final int WEBVIEW_FORWAR = 0x0006;
private static final int WEBVIEW_BACK = 0x0007;
private static final int WEBVIEW_BACK_NO = 0x0008;
private static final int WEBVIEW_FORWAR_NO = 0x0009;

int x = 0;//记录触摸时的位置
int y = 0;//记录滑动是移动的位置
int count = -1;
int maxPage = 0;

private boolean isClickWebviewBack = false;
private boolean isClickWebviewForwar = false;

List<Integer> pageNum = new ArrayList<Integer>();
List<Integer> webNum = new ArrayList<Integer>();

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.webview_act_main);

Intent intent = getIntent();



         System.out.println(">url>>" + url);
         
initViews();
initWebView();
setListener();

startCountTimeThread();
}




/**
* 初始化view
*/
private void initViews() {
mDialog = new ProgressDialog(this);
mDialog.setMessage("loading...");

mWebView = (WebView) findViewById(R.id.webview);
mBackButton = (ImageButton) findViewById(R.id.game_back);

webview_linearlayout_01 = findViewById(R.id.webview_linearlayout_01);
webview_linearlayout_02 = findViewById(R.id.webview_linearlayout_02);

webviewBackBut = (ImageButton) findViewById(R.id.webview_back);
webviewForwardBut = (ImageButton) findViewById(R.id.webview_forward);
webviewRefreshBut = (ImageButton) findViewById(R.id.webview_refresh);

webViewTitle = (TextView) findViewById(R.id.webview_title);
}

/**
* 设置webview
*/
@SuppressLint("SetJavaScriptEnabled")
private void initWebView() {
//如果访问的页面中有Javascript,则webview必须设置支持Javascript
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setBuiltInZoomControls(false);
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
mHandler.sendEmptyMessage(SHOW_DIALOG);
Log.d(TAG, "progress.........." + newProgress);
                 if (newProgress == 100){
Log.d(TAG, ">>>>>>>>>>progress  stop>>>>>>>>>");
mHandler.sendEmptyMessage(DISS_DIALOG);
                 }
}

/**
* 获取WebView当前页面的标题
*/
@Override
public void onReceivedTitle(WebView view, String title) {
Log.e(TAG, "webview title...:" + title);


if (isClickWebviewBack) {
Log.i(TAG, "isClickWebviewBack...:" + isClickWebviewBack);
count--;

}else {
count++;
pageNum.add(count);
}
Log.d(TAG, "onProgressChanged...:"  + "count=:" + count + ">>" + pageNum.size());
}

});


/**

* 覆盖WebView默认使用第三方或系统默认浏览器打开网页的行为,使网页用WebView打开

* 点击网页内链接时调用
*/
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i(TAG, "shouldOverrideUrlLoading...:" + url);
mHandler.sendEmptyMessage(WEBVIEW_BACK);
mHandler.sendEmptyMessage(WEBVIEW_FORWAR_NO);

webNum.add(1);
maxPage = webNum.size();

Log.i(TAG, "shouldOverrideUrlLoading...:  maxPage" + maxPage);

isClickWebviewBack = false;
isClickWebviewForwar = false;

if (!url.startsWith("http")) {
try {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
 //                view.loadUrl(url);
                 return false;
}

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
super.onPageStarted(view, url, favicon);
Log.i(TAG, "》》》》》》》》》》》》》》》》onPageStarted》》》》》》》》》》》》》》》》》》》》");
}

@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
super.onPageFinished(view, url);
String title = view.getTitle();
 
Log.d(TAG, "onPageFinished...:"  + "count=:" + count);

Message msg = mHandler.obtainMessage();
Bundle b = new Bundle();
b.putString("title", title);
msg.setData(b);
msg.what = UPDATE_TITLE;
msg.sendToTarget();
}

@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
// TODO Auto-generated method stub
super.onReceivedError(view, errorCode, description, failingUrl);

Log.d(TAG, "onReceivedError...:");
}
});

/**
* 网页返回
*/
webviewBackBut.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
isClickWebviewBack = true;
if (mWebView.canGoBack()) {
mHandler.sendEmptyMessage(SHOW_DIALOG);
mWebView.goBack();

mHandler.sendEmptyMessage(WEBVIEW_FORWAR);
count--;
pageNum.remove(pageNum.size()-1);
webNum.remove(webNum.size()-1);

Log.d(TAG, ".webviewBackBut..:>>>>>>>" + count);
if (count == 0) {
mHandler.sendEmptyMessage(WEBVIEW_BACK_NO);
}

}else{
System.out.println(">>>>>>>>>>back>>>>no>>>>>");
}
}
});

/**
* 网页前进
*/
webviewForwardBut.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
isClickWebviewForwar = true;
if (mWebView.canGoForward()) {
mHandler.sendEmptyMessage(SHOW_DIALOG);
mWebView.goForward();
count++;
pageNum.add(count);
webNum.add(1);
Log.d(TAG, ".webviewForwardBut..:" + count +"==" +pageNum.size());
mHandler.sendEmptyMessage(WEBVIEW_BACK);
if (count+1 == pageNum.size()) {
if (maxPage == webNum.size()) {
mHandler.sendEmptyMessage(WEBVIEW_FORWAR_NO);
}
}else {
System.out.println(">>>>>>>>>>forward>>>>>no>>>>");
}
}
});

/**
* setOnTouchListener 和 setOnClickListener 同时使用时,onTouch 的返回值要设为 false
* (如果设置为true时,webview页面无法滑动)
*/
mWebView.setOnTouchListener(new OnTouchListener() {

@SuppressLint("NewApi")
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x = mWebView.getScrollY();
break;
case MotionEvent.ACTION_MOVE:
y = mWebView.getScrollY();
Log.d(TAG, ".ACTION_MOVE..:" + view.getHeight() + ">>" + mWebView.getContentHeight() + ">>>" + view.getMeasuredHeight() + "y>>" + y + ",x===" + x);
//getMeasuredHeight()是实际View的大小,与屏幕无关,
if (mWebView.getHeight() < mWebView.getContentHeight()) {
if (x-y < 0) {
//上滑隐藏
mHandler.sendEmptyMessage(HIDE_MSG);
}else if( x-y == 0){

}else {
//下滑出现
mHandler.sendEmptyMessage(VIEW_VISIBLE);
}
}else {
mHandler.sendEmptyMessage(VIEW_VISIBLE);
}
 
break;
case MotionEvent.ACTION_UP:
 
try {
// 线程休眠1s.
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}
// 重置ButtonLayout已经显示的时间
mCountTimeThread.reset();
boolean isVisible = (webview_linearlayout_02.getVisibility() == View.VISIBLE);
if (!isVisible) {
mHandler.sendEmptyMessage(VIEW_VISIBLE);
}

break;
}

return false;
}
});
 

//加载需要显示的网页  
mWebView.loadUrl(url);
}

/**
* 设置监听
*/
private void setListener() {
/**
* 返回游戏的按钮
*/
mBackButton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});

/**
* 刷新当前网页监听
*/
webviewRefreshBut.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
System.out.println(">>>>>>>>>>>>>url>>>>>>>>>>>>>" + mWebView.getUrl());
mWebView.loadUrl(mWebView.getUrl());
}
});
}

/**
* 更新UI
*/
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case HIDE_MSG:
webview_linearlayout_02.setVisibility(View.GONE);
break;
case DISS_DIALOG:
dissDialog();
break;
case SHOW_DIALOG:
showDialog();
break;
case VIEW_VISIBLE:
webview_linearlayout_01.setVisibility(View.VISIBLE);
webview_linearlayout_02.setVisibility(View.VISIBLE);
break;
case UPDATE_TITLE:
Bundle b = msg.getData();
String title = b.getString("title");
Log.e(TAG, ">>>>>UPDATE_TITLE>>>>>>>" + title);
webViewTitle.setText(title);
break;
case WEBVIEW_BACK:
webviewBackBut.setImageResource(R.drawable.webview_back_selector);
break;
case WEBVIEW_FORWAR:
webviewForwardBut.setImageResource(R.drawable.webview_forwart_selector);
break;
case WEBVIEW_BACK_NO:
webviewBackBut.setImageResource(R.drawable.webview_back_press);
break;
case WEBVIEW_FORWAR_NO:
webviewForwardBut.setImageResource(R.drawable.webview_forwart_press);
break;
}
};
};

private void showDialog() {
         if ((mDialog != null) && (mDialog.isShowing())) {
             return;
         }
         mDialog.show();
     }
 
     private void dissDialog() {
         if ((mDialog != null) && (mDialog.isShowing())) {
             mDialog.dismiss();
         }
     }



    

    

    

    

    

    

    


/**

* 开始启动线程控制按钮组件的显示.
*/
private void startCountTimeThread() {
mCountTimeThread = new CountTimeThread(2);
mCountTimeThread.start();
}

/**
* 如果ButtonLayout可见, 则无操作second秒之后隐藏ButtonLayout.
* @author playcrab
*
*/
private class CountTimeThread extends Thread {
private final long maxVisibleTime;
private long startVisibleTime;

/**
* @param second 设置按钮控件最大可见时间,单位是秒
*/
public CountTimeThread(int second) {
// 将时间换算成毫秒
maxVisibleTime = second * 1000;

// 设置为后台线程.
setDaemon(true);
}

/**
* 每当界面有操作时就需要重置ButtonLayout开始显示的时间,
*/
public synchronized void reset() {
startVisibleTime = System.currentTimeMillis();
}

public void run() {
startVisibleTime = System.currentTimeMillis();

while (true) {
// 如果已经到达了最大显示时间, 则隐藏功能控件.
if ((startVisibleTime + maxVisibleTime) < System.currentTimeMillis()) {
// 发送隐藏按钮控件消息.
mHandler.sendEmptyMessage(HIDE_MSG);

startVisibleTime = System.currentTimeMillis();
}

try {
// 线程休眠1s.
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}





 }