关于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();

Bundle extras = intent.getExtras();

url = extras.getString("url");

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();

}

}

}

}

}


更多相关文章

  1. [android] 解决DatePickerDialog和TimePickerDialog控件取消按钮
  2. AndroidGUI30:定制按钮
  3. android之复选框点击事件(掌握CheckBox复选控件)
  4. Android解决用户多次点击按钮问题
  5. Android中Progress的简单实例
  6. Android--Dialog
  7. Qt on Android:图文详解QT开发Andriod入门,Hello World全过程
  8. android 5.x—Palette图片取色调
  9. android设置软键盘搜索键以及监听搜索键点击时发生两次事件的问

随机推荐

  1. Android 图形用户界面 之 绘图(一)
  2. android解析生成xml文件
  3. android 获取通讯录中同一联系人的多个号
  4. Android实现更换皮肤功能
  5. ADB和Fastboot最新版的谷歌官方下载链接
  6. android检查网络连接状态
  7. Android开发系列教程——目录
  8. Android studio升级3.0.1之后原项目签名
  9. [置顶] Android(安卓)SQlite使用实践Demo
  10. build command in android