android与html交互
⑴ android webview 怎样监听HTML中的按钮并得到按钮的url
webview中是无法做到的,除非这个HTML页面是由你写的。
具体分析如下:
webview中是无法做到的,除非这个HTML页面是由你写的,用户输入结束,HTML上调用你提前插入的JS告知到你的app,你再去做记录。
目前android市场上的一些应用采用的开发方式大致分为三种:Native
App、Web
App、Hybrid
App。
Android
API中提供了WebView组件来实现对html的渲染。所谓的HybridApp开发方式即是汇集了HTML5、CSS3、jS的相关开发技术,以及数据交换格式json/XML。这显然是Web开发工程师的技能。
有了WebView这个组件,Android应用开发技术也就转嫁到html与java数据交互上来,说白了就是js与WebView的数据交互。
现在这样是不能交互的,必须添加javaScripetInterface,这样可以交互但是不安全。
⑵ html5怎么与android交互
Android中构建HTML5应用
使用WebView控件,与其他控件的使用方法相同在layout中使用一个标签,WebView不包括导航栏,地址栏等完整浏览器功能,只用于显示一个html.
在WebView中加载Web页面:
(1)注意在manifest文件中加入访问互联网的权限:
<</SPAN>uses-permission android:name="android.permission.INTERNET" />
在Android中点击一个链接,默认是调用应用程序来启动,因此WebView需要代为处理这个动作通过WebViewClient。
(2)在布局文件中(main.xml),添加标签WebView的id
[html] view plainprint?
<</SPAN>WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
(2)在onCreate()中使用loadUrl(...)加载html。
[java] view plainprint?
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WebView mWebView = (WebView)findViewById(R.id.webview);
// mWebView.getSettings().setJavaScriptEnabled(true);
// mWebView.setWebChromeClient(new WebChromeClient());
mWebView.loadUrl("file:///android_asset/www/NewFile.html");
}
(3)实现android与js交互
默认情况下WebView中的js是禁用的,通过将WebSettings附加到WebView中启动js,可以用getSettings()检索WebSettings,然后用setJavaScriptEnabled()启动js。
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient());
(4)在JS中调用Android的函数方法
把本类的一个实例添加到js的全局对象window中,这里是"injs"。
mWebView.addJavascriptInterface(new JavaScriptInterface(),"injs");
实现JavaScriptInterface()类,这里在该类中定义一个方法public void runOnAndroidJavaScript(final String str){...}
在js中调用java函数
windows.injs.runOnAndroidJavaScript(str);//调用android的函数
⑶ android 我在html5开发操作后怎么接受它返回的数据
依据Gartner的研究,Android是全球最受欢迎的移动操作系统,是它支持着大多数智能手机;而依据Canalys的调研,现在在平板电脑领域享有多数市场份额(53%)。让Android有如此热度的一部分因素是其多样性。几乎每个用户都有一个的Android设备的尺寸和形状,想要一个13英寸带可拆卸键盘的平板电脑?Android同样满足你。
当如此多样的设备让用户欢喜时,它也为开发人员带来了不少头疼的麻烦。屏幕尺寸、分辨率、CPU架构和操作系统版本等,都会为开发人员创建原生Android app带来挑战。幸运的是,HTML5使得处理这庞大而多样的Android设备队伍变得快速而简单。
“服务员,我的冻酸奶里面有果冻豆”
Android初次广泛登台是在2009年。制造商发布设备,一般只对操作系统更新一两次,就放弃它开始关注新硬件了。因此,根据OpenSignal对超过五十万台Android设备中,名为Gingerbread(姜饼2.3 x)的版本依然占据着最大市场份额(34.1%)。
Android SDK是操作系统特定的,这为Android开发人员营造了挑战。也就是说,如果你用4.0 SDK(冰淇淋三明治)开发app,你的app将不能在2.3(姜饼)上运行。这无疑让开发人员置身于一个尴尬境地。一方面,你要用最新最好的SDK,另一方面,你要app得到尽可能多的下载。
有了HTML5,你不用再纠结于选择。你可以用强大的它来构建你的app,无视Android操作系统版本。
庞大的Android设备队伍
在Android设备运行的不同不仅仅是表面上的,任何Android设备的心脏部分都是CPU由Qualcomm、PowerVR、NVidia、MediaTek、Intel等制造。取决于你的app需要用到哪个操作系统的特性,原生Android SDK可能不会兼容什么特别设备。
HTML5提供APIs来做很多通常被认为是原生操作系统功能的事情。HTML5包含对于键/值存储、文件系统IO甚至通过地理定位访问GPS的强大APIs。
要访问原生操作系统功能,没有标准的HTL5界面。 Apache Cordova framework提供一个界面让你的app在任何设备上访问原生操作系统资源,诸如摄像机和加速计。
各种形状和大小
Android设备有着各种尺寸,小至三星的新齿轮智能手表,大至13英寸或更大的平板电脑。更添其复杂性的是分辨率范围从240×320跨到2560×1600。
要解决这个问题,你可能得用线形布局或网格视图。这类布局能良好运行,如果你想要依据用户需求滚动到视图中查看app。
好在HTML5提供一个更好的途径来处理尺寸大小的问题——用响应设计。响应设计是由CSS Media Queries所增强的简单结构的HTML在更大的屏幕利用更多的空间,在更小的屏幕上缩小或消除那些并不重要的元素。
当响应设计正确完成时,用户就对跨平台的app有了流畅的体验,即便是重新调整屏幕,这是在任何操作系统上解决屏幕尺寸/分辨率问题的最好办法。
移植到其它平台
Java的愿景是“write once, run any where(只写一次,哪儿都能跑)”。不幸,出于种种原因,不能实现这个梦。一些交互编译器可以允许创建针对Android和iOS的app,但只有HTML5能在移动操作系统和互联网浏览器上运行。
在诸如Android、iOS、Windows Phone等移动操作系统上,HTML5应用通常托管于Apache Cordova (aka PhoneGap)内,Apache Cordova充当将你的HTML5联系到原生操作系统的角色,这包括定义你的app图标、加载屏幕和提供JavaScript来访问原生操作系统硬件。
HTML5支持跨平台,当然,还支持网页。你第一次用HTML5取代.ASPX或PHP来开启一个新项目将需要十足的信仰之外,还要你的app在没有服务器端生成HTML的情况下工作。
开启你的浏览器
HTML5应用的性能可以无限接近于原生性能,如果它们是被精心无误地制作处理的。
HTML5应用绝对需要被安装到设备上。通过将Apache Cordova或嵌入的WebView指向一个托管于互联网的网页来构建的app只能提供可怜的用户体验。如果你的app每次都需要用户通过点击一些东西来下载用户界面,这是不可能满足他们“即时响应”的期望的。为获得接近于原生的速度,你所有的HTML5、JavaScript和CSS都必须安装在本地设备上,从而使它能够在用户点击后就运行。
大多数移动app从互联网服务器上加载和保存数据。为了保持你的app以最快的速度响应,你将要在本地存储一个缓存数据并异步刷新你的数据。这将允许你的app在异步更新时,立即渲染其UI。
HTML的复杂性使得关于渲染你的用户界面需要多少CPU cycles有了很大不同,最好是保持你的HTML尽可能地结构简单化,带有尽可能少的嵌套级别标签。举个例子说,深度嵌套的HTML表格,是出了名地衰!
结论
HTML5允许你写一次应用程序并快速部署它到几乎现有的每个操作系统。它即时响应的能力很适合现在数不胜数的安卓设备屏幕尺寸。凭借大量可用的工具,诸如 Intel XDK new IDE,你可以在Android使用HTML开放式架构、CSS和JavaScript上提供一种美妙的体验。
⑷ android能与spring mvc后台Html通信吗
直接通过android自带的浏览器访问。如果要传递参数给服务器,需要用httpUrlconnection或者Socket通信,把参数拼接好后传递给服务器。如果要获取服务器返回的数据(必须是此种格式之一:xml或json或参数字符串),用httpUrlconnection或socket中获取网络输入流,转换成相应格式解析。如果从服务器获取视频文件的话,就得使用断点续传下载获取。如果要上传文件的话就用socket上传。不要使用httpUrlconnection,因为它会缓存文件到内存,从而导致android内存太少文件太大而内存溢出。
⑸ android 怎么改变html中文字的大小
通过android代码与html代码交互实现。下面是交互的小例子,这个例子来源于android学习手册,360手机助手中下载,包含108个例子,文档还有源码。
1 调用网页上的js代码
Android中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true,,然后通过loadUrl就可以直接进行调用,如下所示:
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl("javascript:test()");
2 网页java代码的方法
在网页中调用java代码,需要在webview控件中添加javascriptInterface。如下所示:
mWebView.addJavascriptInterface(newObject() {
publicvoid clickOnAndroid() {
mHandler.post(newRunnable() {
publicvoid run() {
Toast.makeText(Test.this,"测试调用java", Toast.LENGTH_LONG).show();
}
});
}
},"demo");
在网页中,只需要像调用js方法一样,进行调用就可以
<div id='b'><a onclick="window.demo.clickOnAndroid()">b.c</a></div>
3 Java代码调用js并传参
首先需要带参数的js函数,如functiontest(str),然后只需在调用js时传入参数即可,如下所示:
mWebView.loadUrl("javascript:test('aa')");
4.Js中调用java函数并传参
首先一样需要带参数的函数形式,但需注意此处的参数需要final类型,即得到以后不可修改,如果需要修改其中的值,可以先设置中间变量,然后进行修改。如下所示:
mWebView.addJavascriptInterface(newObject() {
publicvoid clickOnAndroid(final int i) {
mHandler.post(newRunnable() {
publicvoid run() {
intj = i;
j++;
Toast.makeText(Test.this,"测试调用java" + String.valueOf(j), Toast.LENGTH_LONG).show();
}
});
}
},"demo");
⑹ android嵌入h5,怎么交互
Android和H5之间的交互
hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的?
1、webView加载页面
我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置不同写法也不同:
//例如:加载assets文件夹下的test.html页面
mWebView.loadUrl("file:///android_asset/test.html")
//例如:加载网页
mWebView.loadUrl("http://www..com")
如果只是这样调用mWebView.loadUrl()加载的话,那么当你点击页面中的链接时,页面将会在你手机默认的浏览器上打开。那如果想要页面在App内中打开的话,那么就得设置setWebViewClient:
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
mWebView.loadUrl(url);
return true;
}
}
});
2、Android本地通过Java调用HTML页面中的JavaScript方法
想要调用js方法那么就必须让webView支持
WebSettings webSettings = mWebView.getSettings();
//设置为可调用js方法
webSettings.setJavaScriptEnabled(true);
若调用的js方法没有返回值,则直接可以调用mWebView.loadUrl("JavaScript:do()");其中do是js中的方法;若有返回值时我们可以调用mWebView.evaluateJavascript()方法:
mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.e(TAG, "onReceiveValue value=" + value);
}
});
js代码如下:
<script type="text/javascript">
function sum(a,b){
return a+b;
}
function do(){
document.getElementById("p").innerHTML="hello world";
}
</script>
2、js调用Android本地Java方法
在Android4.2以上可以直接使用@JavascriptInterface注解来声明,下面是在一个本地Java方法
public class JsInteration {
@JavascriptInterface
public String back() {
return "hello world";
}
}
定义完这个方法后再调用mWebView.addJavascriptInterface()方法:
mWebView.addJavascriptInterface(new JsInteration(), "android");
那么在js中怎么来调用呢?
<script type="text/javascript">
function s(){
//调用Java的back()方法
var result =window.android.back();
document.getElementById("p").innerHTML=result;
}
</script>
4、拦截HTML页面中的点击事件
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//判断url拦截事件
if (url.equals("file:///android_asset/test2.html")) {
Log.e(TAG, "shouldOverrideUrlLoading: " + url);
startActivity(new Intent(MainActivity.this,Main2Activity.class));
return true;
} else {
mWebView.loadUrl(url);
return false;
}
}
});
以上就是Java调用js方法以及js调用Java方法的实现交互方式中的一种。下面给出完整代码:
mainActivity
public class MainActivity extends AppCompatActivity {
public static final String TAG = "MainActivity";
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = (WebView) findViewById(R.id.webView);
mWebView.loadUrl("file:///android_asset/test.html");
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JsInteration(), "android");
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.equals("file:///android_asset/test2.html")) {
Log.e(TAG, "shouldOverrideUrlLoading: " + url);
startActivity(new Intent(MainActivity.this,Main2Activity.class));
return true;
} else {
mWebView.loadUrl(url);
return false;
}
}
});
}
//Android调用有返回值js方法
@TargetApi(Build.VERSION_CODES.KITKAT)
public void onClick(View v) {
mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.e(TAG, "onReceiveValue value=" + value);
}
});
}
public class JsInteration {
@JavascriptInterface
public String back() {
return "hello world";
}
}
}
test.html
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript">
function sum(a,b){
return a+b;
}
function s(){
var result =window.android.back();
document.getElementById("p").innerHTML=result;
}
</script>
</head>
<body>
<button onclick="s()">调用本地方法</button>
<a href="file:///android_asset/test2.html">点击</a>
<p id="p"></p>
</body>
</html>
⑺ android和h5交互,js怎么在android端打印日志
Android和H5之间的交互hybridApp开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的?1、webView加载页面我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置不同写法也不同://例如:加载assets文件夹下的test.html页面mWebView.loadUrl("file:///android_asset/test.html")//例如:加载网页mWebView.loadUrl("")如果只是这样调用mWebView.loadUrl()加载的话,那么当你点击页面中的链接时,页面将会在你手机默认的浏览器上打开。那如果想要页面在App内中打开的话,那么就得设置setWebViewClient:mWebView.setWebViewClient(newWebViewClient(){@(WebViewview,Stringurl){mWebView.loadUrl(url);returntrue;}}});2、Android本地通过Java调用HTML页面中的JavaScript方法想要调用js方法那么就必须让webView支持WebSettingswebSettings=mWebView.getSettings();//设置为可调用js方法webSettings.setJavaScriptEnabled(true);若调用的js方法没有返回值,则直接可以调用mWebView.loadUrl("JavaScript:do()");其中do是js中的方法;若有返回值时我们可以调用mWebView.evaluateJavascript()方法:mWebView.evaluateJavascript("sum(1,2)",newValueCallback(){@(Stringvalue){Log.e(TAG,"onReceiveValuevalue="+value);}});js代码如下:2、js调用Android本地Java方法在Android4.2以上可以直接使用@JavascriptInterface注解来声明,下面是在一个本地Java方法publicclassJsInteration{@(){return"helloworld";}}定义完这个方法后再调用mWebView.addJavascriptInterface()方法:mWebView.addJavascriptInterface(newJsInteration(),"android");那么在js中怎么来调用呢?4、拦截HTML页面中的点击事件mWebView.setWebViewClient(newWebViewClient(){@(WebViewview,Stringurl){//判断url拦截事件if(url.equals("file:///android_asset/test2.html")){Log.e(TAG,"shouldOverrideUrlLoading:"+url);startActivity(newIntent(MainActivity.this,Main2Activity.class));returntrue;}else{mWebView.loadUrl(url);returnfalse;}}});以上就是Java调用js方法以及js调用Java方法的实现交互方式中的一种。下面给出完整代码:{publicstaticfinalStringTAG="MainActivity";privateWebViewmWebView;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mWebView=(WebView)findViewById(R.id.webView);mWebView.loadUrl("file:///android_asset/test.html");WebSettingswebSettings=mWebView.getSettings();webSettings.setJavaScriptEnabled(true);mWebView.addJavascriptInterface(newJsInteration(),"android");mWebView.setWebViewClient(newWebViewClient(){@(WebViewview,Stringurl){if(url.equals("file:///android_asset/test2.html")){Log.e(TAG,"shouldOverrideUrlLoading:"+url);startActivity(newIntent(MainActivity.this,Main2Activity.class));returntrue;}else{mWebView.loadUrl(url);returnfalse;}}});}//Android调用有返回值js方法@TargetApi(Build.VERSION_CODES.KITKAT)publicvoidonClick(Viewv){mWebView.evaluateJavascript("sum(1,2)",newValueCallback(){@(Stringvalue){Log.e(TAG,"onReceiveValuevalue="+value);}});}publicclassJsInteration{@(){return"helloworld";}}}test.html调用本地方法点击
⑻ 如何在android中使用html5的本地数据库
解决方案1:
通过将Apache Cordova或嵌入的WebView指向一个托管于互联网的网页来构建的app只能提供可怜的用户体验、分辨率。
HTML5支持跨平台,诸如 Intel XDK new IDE,HTML5使得处理这庞大而多样的Android设备队伍变得快速而简单。更添其复杂性的是分辨率范围从240×320跨到2560×1600。这类布局能良好运行, run any where(只写一次。这无疑让开发人员置身于一个尴尬境地,现在在平板电脑领域享有多数市场份额(53%),诸如摄像机和加速计,你要用最新最好的SDK,就放弃它开始关注新硬件了。这将允许你的app在异步更新时。
有了HTML5。
庞大的Android设备队伍
在Android设备运行的不同不仅仅是表面上的。它即时响应的能力很适合现在数不胜数的安卓设备屏幕尺寸,你的app将不能在2、Intel等制造。
好在HTML5提供一个更好的途径来处理尺寸大小的问题——用响应设计。让Android有如此热度的一部分因素是其多样性。你可以用强大的它来构建你的app。为了保持你的app以最快的速度响应,无视Android操作系统版本,原生Android SDK可能不会兼容什么特别设备。
大多数移动app从互联网服务器上加载和保存数据。你第一次用HTML5取代、CPU架构和操作系统版本等。
“服务员,根据OpenSignal对超过五十万台Android设备中,当然,小至三星的新齿轮智能手表,名为Gingerbread(姜饼2,从而使它能够在用户点击后就运行、Windows Phone等移动操作系统上,是它支持着大多数智能手机,没有标准的HTL5界面,这包括定义你的app图标,立即渲染其UI.1%).3 x)的版本依然占据着最大市场份额(34。一些交互编译器可以允许创建针对Android和iOS的app、iOS,HTML5应用通常托管于Apache Cordova (aka PhoneGap)内;值存储,是出了名地衰,还要你的app在没有服务器端生成HTML的情况下工作、加载屏幕和提供JavaScript来访问原生操作系统硬件。制造商发布设备。为获得接近于原生的速度、CSS和JavaScript上提供一种美妙的体验。
要访问原生操作系统功能,在更小的屏幕上缩小或消除那些并不重要的元素。一方面.0 SDK(冰淇淋三明治)开发app。如果你的app每次都需要用户通过点击一些东西来下载用户界面;而依据Canalys的调研。
HTML5应用绝对需要被安装到设备上,深度嵌套的HTML表格。因此,你不用再纠结于选择。
Android SDK是操作系统特定的!
结论
HTML5允许你写一次应用程序并快速部署它到几乎现有的每个操作系统。几乎每个用户都有一个的Android设备的尺寸和形状,另一方面。
当如此多样的设备让用户欢喜时,即便是重新调整屏幕.ASPX或PHP来开启一个新项目将需要十足的信仰之外。不幸,如果你想要依据用户需求滚动到视图中查看app?Android同样满足你。
移植到其它平台
Java的愿景是“write once,哪儿都能跑)”,还支持网页。也就是说、MediaTek,带有尽可能少的嵌套级别标签。
在诸如Android,想要一个13英寸带可拆卸键盘的平板电脑、文件系统IO甚至通过地理定位访问GPS的强大APIs。
HTML5提供APIs来做很多通常被认为是原生操作系统功能的事情,任何Android设备的心脏部分都是CPU由Qualcomm。HTML5包含对于键/。
HTML的复杂性使得关于渲染你的用户界面需要多少CPU cycles有了很大不同,大至13英寸或更大的平板电脑,出于种种原因,最好是保持你的HTML尽可能地结构简单化。
当响应设计正确完成时,这是在任何操作系统上解决屏幕尺寸/,用户就对跨平台的app有了流畅的体验、PowerVR、NVidia,它也为开发人员带来了不少头疼的麻烦。幸运的是。响应设计是由CSS Media Queries所增强的简单结构的HTML在更大的屏幕利用更多的空间。屏幕尺寸.3(姜饼)上运行,你可能得用线形布局或网格视图,如果它们是被精心无误地制作处理的。
各种形状和大小
Android设备有着各种尺寸,你将要在本地存储一个缓存数据并异步刷新你的数据,但只有HTML5能在移动操作系统和互联网浏览器上运行,你所有的HTML5,如果你用4,我的冻酸奶里面有果冻豆”
Android初次广泛登台是在2009年,这为Android开发人员营造了挑战、JavaScript和CSS都必须安装在本地设备上,你要app得到尽可能多的下载,都会为开发人员创建原生Android app带来挑战,你可以在Android使用HTML开放式架构。举个例子说,一般只对操作系统更新一两次,Apache Cordova充当将你的HTML5联系到原生操作系统的角色。
要解决这个问题;分辨率问题的最好办法。凭借大量可用的工具。取决于你的app需要用到哪个操作系统的特性,这是不可能满足他们“即时响应”的期望的。
开启你的浏览器
HTML5应用的性能可以无限接近于原生性能。 Apache Cordova framework提供一个界面让你的app在任何设备上访问原生操作系统资源,Android是全球最受欢迎的移动操作系统
⑼ webview 与html5有几种交互方式
对于android初学者应该都了解webView这个组件。之前我也是对其进行了一些简单的了解,但是在一个项目中不得不用webview的时候,发现了webview的强大之处,今天就分享一下使用webview的一些经验。
1、首先了解一下webview。
webview介绍的原文如下:A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content within your Activity. It uses the WebKit rendering engine to display web pages and includes methods to navigate forward and backward through a history, zoom in and out, perform text searches and more.
从上面你应该了解到了基本功能,也就是显示网页。之所以我说webview功能强大是因为它和js的交互非常方便,很简单就可以实现。
2、webview能做什么?
①webView可以利用html做界面布局,虽然目前还比较少人这么使用,不过我相信当一些客户端需要复杂的图文(图文都是动态生成)混排的时候它肯定是个不错的选择。
②直接显示网页,这功能当然也是它最基本的功能。
③和js交互。(如果你的js基础比java基础好的话那么采用这种方式做一些复杂的处理是个不错的选择)。
3、如何使用webview?
这里直接用一个svn上取下的demo,先上demo后讲解。demo的结构图如下:
WebViewDemo.java
package com.google.android.webviewdemo;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
/**
* Demonstrates how to embed a WebView in your activity. Also demonstrates how
* to have javascript in the WebView call into the activity, and how the activity
* can invoke javascript.
* <p>
* In this example, clicking on the android in the WebView will result in a call into
* the activities code in {@link DemoJavaScriptInterface#clickOnAndroid()}. This code
* will turn around and invoke javascript using the {@link WebView#loadUrl(String)}
* method.
* <p>
* Obviously all of this could have been accomplished without calling into the activity
* and then back into javascript, but this code is intended to show how to set up the
* code paths for this sort of communication.
*
*/
public class WebViewDemo extends Activity {
private static final String LOG_TAG = "WebViewDemo";
private WebView mWebView;
private Handler mHandler = new Handler();
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
mWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setSavePassword(false);
webSettings.setSaveFormData(false);
webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(false);
mWebView.setWebChromeClient(new MyWebChromeClient());
mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
mWebView.loadUrl("file:///android_asset/demo.html");
}
final class DemoJavaScriptInterface {
DemoJavaScriptInterface() {
}
/**
* This is not called on the UI thread. Post a runnable to invoke
* loadUrl on the UI thread.
*/
public void clickOnAndroid() {
mHandler.post(new Runnable() {
public void run() {
mWebView.loadUrl("javascript:wave()");
}
});
}
}
/**
* Provides a hook for calling "alert" from javascript. Useful for
* debugging your javascript.
*/
final class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.d(LOG_TAG, message);
result.confirm();
return true;
}
}
}
demo.html
<html>
<script language="javascript">
/* This function is invoked by the activity */
function wave() {
alert("1");
document.getElementById("droid").src="android_waving.png";
alert("2");
}
</script>
<body>
<!-- Calls into the javascript interface for the activity -->
<a onClick="window.demo.clickOnAndroid()"><div style="width:80px;
margin:0px auto;
padding:10px;
text-align:center;
border:2px solid #202020;" >
<img id="droid" src="android_normal.png"/><br>
Click me!
</div></a>
</body>
</html>
main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/intro"
android:padding="4dip"
android:textSize="16sp"
/>
<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
/>
</LinearLayout>
4、如何交互?
①android如何调用js。
调用 形式:
mWebView.loadUrl("javascript:wave()");
其中wave()是js中的一个方法,当然你可以把这个方法改成其他的方法,也就是android调用其他的方法。
②js如何调用android。
调用形式:
<a onClick="window.demo.clickOnAndroid()">
代码中的“demo”是在android中指定的调用名称,即
mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
代码中的clickOnAndroid()是“demo”对应的对象:new DemoJavaScriptInterface() 中的一个方法。
③双向交互。
当然是把前面的两种方式组合一下就可以了。
5、讲解demo。
现在你一定了解了android和js的交互了。是时候分析一些demo了,根据上面讲的你也应该比较清楚了。具体交互流程如下:
①点击图片,则在js端直接调用android上的方法clickOnAndroid();
②clickOnAndroid()方法(利用线程)调用js的方法。
③被②调用的js直接控制html。
个人总结:利用webView的这种方式在有些时候UI布局就可以转成相应的html代码编写了,而html布局样式之类有DW这样强大的工具,而且网上很多源码,很多代码片。在UI和视觉效果上就会节省很多时间,重复发明轮子没有任何意义。
⑽ 如何在android中使用html作布局文件
在android开发中,通常使用xml格式来描述布局文件。就目前而言,熟悉android布局及美化的人员少之又少,出现了严重的断层。大部分企业,其实还是程序员自己动手布局。这样既浪费时间和精力,也未必能达到理想的效果。但是,在企业级的android开发中,使用html页面进行布局,也有很多的优势(例如:简单,大部分开发人员及美工都熟悉,方便统一进行更新,管理)。据笔者了解,已经有不少的公司在使用这种方式进行布局开发。这也可能是一种趋势。
下面,我将给出一个实例代码,供大家学习使用html页面给android应用布局。
Java代码
package com.dazhuo.ui;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import com.dazhuo.domain.Person;
import com.dazhuo.service.PersonService;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
public class MainActivity extends Activity {
private PersonService service;
private WebView webview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
service =new PersonService();
webview = (WebView) this.findViewById(R.id.webView);//android内置浏览器对象
webview.getSettings().setJavaScriptEnabled(true);//启用javascript支持
//添加一个js交互接口,方便html布局文件中的javascript代码能与后台java代码直接交互访问
webview.addJavascriptInterface(new PersonPlugin() , "Person");//new类名,交互访问时使用的别名
// <body onload="javascript:Person.getPersonList()">
webview.loadUrl("file:///android_asset/index.html");//加载本地的html布局文件
//其实可以把这个html布局文件放在公网中,这样方便随时更新维护 例如 webview.loadUrl("www.xxxx.com/index.html");
}
//定义一个内部类,从java后台(可能是从网络,文件或者sqllite数据库) 获取List集合数据,并转换成json字符串,调用前台js代码
private final class PersonPlugin{
public void getPersonList(){
List<Person> list = service.getPersonList();//获得List数据集合
//将List泛型集合的数据转换为JSON数据格式
try {
JSONArray arr =new JSONArray();
for(Person person :list)
{
JSONObject json =new JSONObject();
json.put("id", person.getId());
json.put("name", person.getName());
json.put("mobile",person.getMobile());
arr.put(json);
}
String JSONStr =arr.toString();//转换成json字符串
webview.loadUrl("javascript:show('"+ JSONStr +"')");//执行html布局文件中的javascript函数代码--
Log.i("MainActivity", JSONStr);
} catch (Exception e) {
// TODO: handle exception
}
}
//打电话的方法
public void call(String mobile){
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+ mobile));
startActivity(intent);
}
}
}
Java代码
package com.dazhuo.domain;
public class Person {
private Integer id;
public Integer getId() {
return id;
}
public Person(Integer id, String name, String mobile) {
super();
this.id = id;
this.name = name;
this.mobile = mobile;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
private String name;
private String mobile;
}
Java代码
package com.dazhuo.service;
import java.util.ArrayList;
import java.util.List;
import com.dazhuo.domain.Person;
public class PersonService {
public List<Person> getPersonList()
{
List<Person> list =new ArrayList<Person>();
list.add(new Person(32, "aa", "13675574545"));
list.add(new Person(32, "bb", "13698874545"));
list.add(new Person(32, "cc", "13644464545"));
list.add(new Person(32, "dd", "13908978877"));
list.add(new Person(32, "ee", "15908989898"));
return list;
}
}
Html代码
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function show(jsondata){
var jsonobjs = eval(jsondata);
var table = document.getElementById("personTable");
for(var y=0; y<jsonobjs.length; y++){
var tr = table.insertRow(table.rows.length); //添加一行
//添加三列
var td1 = tr.insertCell(0);
var td2 = tr.insertCell(1);
td2.align = "center";
var td3 = tr.insertCell(2);
td3.align = "center";
//设置列内容和属性
td1.innerHTML = jsonobjs[y].id;
td2.innerHTML = jsonobjs[y].name;
td3.innerHTML = "<a href='javascript:Person.call(\""+ jsonobjs[y].mobile+ "\")'>"+ jsonobjs[y].mobile+ "</a>";
}
}
</script>
</head>
<!-- js代码通过webView调用其插件中的java代码 -->
<body onload="javascript:Person.getPersonList()">
<table border="0" width="100%" id="personTable" cellspacing="0">
<tr>
<td width="20%">编号</td><td width="40%" align="center">姓名</td><td align="center">电话</td>
</tr>
</table>
<a href="javascript:window.location.reload()">刷新</a>
</body>
</html>