1. 问题引入:

前面我们是使用方法 降低屏幕亮度(不常用) 和 替换theme,两者都是针对Activity的背景进行白天、夜间模式的交换,但是如果我们显示的是Html的内容,这个时候改怎么办?

分析:首先加载Html页面肯定是要用到WebView的,通过loadUrl的方法可以把html页面显示到webView,我们知道Android可以与JavaScript进行交互,就是说可以在JavaScript中调用Android的代码,也可以在Android中调用JavaScript代码。

所以就有了一个思路就是,通过Android调用Html页面中的JavaScript代码来控制页面背景和字体样式来达到切换白天/黑夜模式

2. 案例演示:

(1)首先创建一个Android工程如下:

(2)首先我们提供一个Html文件用来测试,为source.html,存放在assets文件夹下:

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd";>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script language=javascript>
function load_night()
{ document.bgColor="#000000"
var fontColor = document.getElementById("font");
if (!fontColor) {
return;
}
fontColor.style.color="white"
}
</script> <script language="javascript">
function load_day(){
document.bgColor="#ffffff"
var fontColor = document.getElementById("font");
if (!fontColor) {
return;
}
fontColor.style.color="black"
}
</script>
<head>
<title>webView测试夜间模式</title>
</head> <body LEFTMARGIN="10" VLINK="#8000FF" BGCOLOR="#FFFFFF" ALINK="#FF0000" LINK="#0000FF"
TOPMARGIN="10" TEXT="#666666">
<div id="font">问世间情为何物,直教人生死相许</div>
</br>
<button type="button" onClick="load_night()">夜间模式</button>
<button type="button" onClick="load_day()">白天模式</button>
</body>
</html>

这个Html布局为:

(3)来到主Activity,如下:

 package com.himi.webview;

 import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button; public class MainActivity extends Activity implements OnClickListener { private WebView webView;
private Button nightModeBtn;
private Button lightModeBtn; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); webView = (WebView) this.findViewById(R.id.webview);
nightModeBtn = (Button) this.findViewById(R.id.btn_nightmode);
lightModeBtn = (Button) this.findViewById(R.id.btn_lightmode); nightModeBtn.setOnClickListener(this);
lightModeBtn.setOnClickListener(this); // webView.loadUrl("http://www.baidu.com"); WebSettings settings = webView.getSettings();
// 设置javaScript可用
settings.setJavaScriptEnabled(true); // 绑定javaScript接口,可以实现在javaScript中调用我们的Android代码
// webView.addJavascriptInterface(new WebAppInterface(this), "Android");
// webView.setWebViewClient(new MyWebViewClient()); // 加载assets目录下的html页面
webView.loadUrl("file:///android_asset/source.html"); } /**
* 用于控制页面导航
*
* @author hebao
*
*/
// private class MyWebViewClient extends WebViewClient {
// /**
// * 当用于点击链接,系统调用这个方法
// */
// @Override
// public boolean shouldOverrideUrlLoading(WebView view, String url) {
// if (Uri.parse(url).getHost().equals("www.baidu.com")) {
// // 这个是我的网页,所以不要覆盖,让我的WebView来加载页面
// return false;
// }
// // 否则,这个链接不是我的网站页面,因此启用浏览器来处理urls
// Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
// startActivity(intent);
// return true;
// }
// } @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 检查是否为返回事件,如果有网页历史记录
if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
webView.goBack();
return true;
}
// 如果不是返回键或没有网页浏览历史,保持默认
// 系统行为(可能会退出该活动)
return super.onKeyDown(keyCode, event);
} @Override
public void onClick(View v) {
//Android调用javascript代码
switch (v.getId()) {
case R.id.btn_nightmode:
webView.loadUrl("javascript:load_night()");
break;
case R.id.btn_lightmode:
webView.loadUrl("javascript:load_day()");
break; default:
break;
}
}
}

上面有必要说明一点:

(1)Android读取assets文件目录下的文件:

  • 资源文件 sample.txt 位于 $PROJECT_HOME/assets/ 目录下,可以在 Activity 中通过 Context.getAssets().open("sample.txt") 方法获取输入流。
  • 资源文件 sample.html 位于 $PROJECT_HOME/assets/ 目录下,可以通过以下代码
    WebView.loadUrl("file:///android_asset/sample.html"); 
    加载html文件。

部署程序到手机上,如下:

本文示例代码下载地址:http://download.csdn.net/detail/hebao5201314/9591112

最新文章

  1. X200s,Debian 8(Jessie) 安装流水帐
  2. 3DMax 常用快捷键
  3. redis操作
  4. Excel的最大行数
  5. javascript高级知识点——闭包
  6. 利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习)
  7. hdu 1875 畅通project再续
  8. Repeater在无数据记录时显示暂无数据
  9. 块和内嵌总结,以及各个标签的应用。其中的ul ol dl特殊定义为auto,使得里面的内容展开
  10. 【hdu3367】Pseudoforest(伪森林)
  11. [原创软件]Maya报错窗口监测器
  12. App隐私条款
  13. EasyUI的Datagrid鼠标悬停显示单元格内容
  14. 关于toncat的Invalid character found in the request target.The valid characters are defined in RFC 7230 and RFC3986
  15. 关于dubbo+zookeeper微服务的一些认识记录
  16. Lombok的@Data、@Setter、@Getter注解没反应问题解决
  17. Spring Cloud Stream如何处理消息重复消费?
  18. mariadb(第一章)
  19. 【ASP.NET Core】浅说目录浏览
  20. OpenCV 学习笔记 05 级联分类器CascadeClassifier类

热门文章

  1. sql中非存储过程定义参数并使用
  2. github删除仓库
  3. 如何利用gulp构建前端自动化
  4. 用bind方法保持this上下文
  5. Java - String, Stringbuilder, StringBuffer比较
  6. JavaScript unshift()怎样添加数据的?
  7. 浅谈TCP/IP(new 常见面试问题)
  8. 一文总结学习 Python 的 14 张思维导图
  9. problem-solving-with-algorithms-and-data-structure-usingpython(使用python解决算法和数据结构) -- 基本数据结构 -- 队列
  10. BZOJ4977: [[Lydsy1708月赛]跳伞求生