在android中实现javascript编程

Posted 拳四郎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在android中实现javascript编程相关的知识,希望对你有一定的参考价值。

运行如图:




示例是插入排序的例子。


主要的思路就是在webview中将编辑后的代码保存为一个html文件中,再用另一个WebView来加载。

直接上代码。

首先在manifest文件中添加几个权限:

	<!-- 链接互联网权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 在SDCard中创建与删除文件权限 -->  
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
    <!-- 往SDCard写入数据权限 -->  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  

布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >


    <WebView
        android:id="@+id/webView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
    <WebView
        android:id="@+id/swebView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:visibility="gone" />

</RelativeLayout>

主activity:

package com.example.webtest1;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.http.util.EncodingUtils;

import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.WebView;
import android.widget.Toast;

public class MainActivity extends Activity 
	private WebView mWebView;
	private WebView sWebView;
	private Handler mHandler;
	@Override
	protected void onCreate(Bundle savedInstanceState) 
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mWebView = (WebView) findViewById(R.id.webView);
		sWebView=(WebView) findViewById(R.id.swebView);
		sWebView.getSettings().setjavascriptEnabled(true);

		mHandler=new Handler();
		// 得到WebSettings对象,设置支持JavaScript参数  
		// 如果访问的页面中有JavaScript,则WebView必须设置支持JavaScript ,否则显示空白页面  
		mWebView.getSettings().setJavaScriptEnabled(true); 
		sWebView.getSettings().setJavaScriptEnabled(true);
		mWebView.getSettings().setBuiltInZoomControls(true);  
		// 加载URL  
		mWebView.loadUrl("file:///android_asset/web/index.html");
		//sWebView.loadUrl("file:///android_asset/result.html");
		final class JSInterface
			public void clickOnAndroid(final String jsCode)  
				mHandler.post(new Runnable() 
					public void run()   
						//Toast.makeText(MainActivity.this, "测试调用java"+s, Toast.LENGTH_LONG).show();
						mWebView.setVisibility(8);
						String html=""; 
						html += "<head>";  
						html += "<body>"+"<script>"+jsCode+"</script>"+"</body>";  
						html += "</head>"; 
						try 
							saveToSDCard("result.html",html);
						 catch (Exception e) 
							// TODO Auto-generated catch block
							e.printStackTrace();
						
						
						Toast.makeText(MainActivity.this,html, Toast.LENGTH_LONG).show(); 
						sWebView.setVisibility(0);
						sWebView.loadUrl("file:///mnt/sdcard/result.html"); 
					 
				); 
			 
		
		mWebView.addJavascriptInterface(new JSInterface(), "demo");
	

	@Override
	public boolean onCreateOptionsMenu(Menu menu) 
		menu.add(0,1,1,"back");
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	
	@Override    
	public boolean onMenuItemSelected(int featureId, MenuItem item)     
		// TODO Auto-generated method stub    
		if(item.getItemId()==1) 
		
			mWebView.setVisibility(0);
			sWebView.setVisibility(8);
		
		return super.onMenuItemSelected(featureId, item);    
	  
	//写数据到SD中的文件  
	   public void saveToSDCard(String filename, String content) throws Exception  
         
           //通过getExternalStorageDirectory方法获取SDCard的文件路径  
           File file = new File(Environment.getExternalStorageDirectory(), filename);  
           //获取输出流  
           FileOutputStream outStream = new FileOutputStream(file);  
           outStream.write(content.getBytes());  
           outStream.close();  
         


在asset/web中添加index.html

<html>
<body>
<h1>Js edit</h1>
<form>
<textarea id="code" name="code" cols="130" rows="15">
//InsertSort
function InsertSort(arr)  
  var st = new Date();
  var temp, j;
  for(var i=1; i<arr.length; i++) 
   if((arr[i]) < (arr[i-1])) 
    temp = arr[i];
    j = i-1;
    do 
     arr[j+1] = arr[j];
     j--;
    
    while (j>-1 && (temp) < (arr[j]));
    arr[j+1] = temp;
   //endif
  
  status = (new Date() - st) + ' ms';
  return arr;
 
var testArray=[3,324,5345,6546,134,5654,665];


document.write("<p>TestArray:</p>");
document.writeln(testArray.toString());
InsertSort(testArray);
document.write("<p>After Sort:</p>");
document.writeln(testArray.toString());
</textarea>
	</form>
	<div id='b'><button οnclick="window.demo.clickOnAndroid(document.getElementById('code').value)">Go!</button></div>


</body>
</html>

打完收工。

以上是关于在android中实现javascript编程的主要内容,如果未能解决你的问题,请参考以下文章

我们如何以编程方式在 Android Q OS 中实现可搜索的进度条?

使用 Native Sockets 在 Android 中实现 WebSockets

如何在 Javascript 中实现 Haskell 的 FRP Behavior 类型?

努力在Android App中实现google方向api

Android - Socket 功能在 Service 中实现这才是实际的使用情况

如何在java中实现接口类