安卓案例:表达式计算器
一、运行效果
如果没有输入表达式或输入表达式有误,会弹出警告对话框:
输入合法的JavaScript表达式:
单击【计算】按钮:
再输入一个表达式进行测试:
二、涉及知识点
1、标签、按钮、文本框
2、网页视图(WebView)
3、安卓调用JavaScript
三、实现步骤
1、创建安卓应用ExpressionCalculator
2、将背景图片background.jpg拷贝到mipmap目录
3、主布局资源文件activity_main.xml
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:background="@mipmap/background"
android:orientation="vertical"
android:padding="15dp" >
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/title"
android:textColor="#0000ff"
android:textSize="30sp" />
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:visibility="gone" />
android:id="@+id/edt_expression"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@android:drawable/edit_text"
android:hint="@string/input_expression"
android:singleLine="true" />
android:id="@+id/tv_result"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="6"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="20dp"
android:textSize="20sp" />
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center" >
android:id="@+id/btn_calculate"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:onClick="doCalculate"
android:text="@string/calculate" />
android:id="@+id/btn_clear"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:onClick="doClear"
android:text="@string/clear" />
4、字符串资源文件strings.xml
表达式计算器
计算
清空
表达式计算器
请输入表达式
5、创建assets目录,在里面创建calculate.html文件
function calculate(exp) {
if (!exp) {
alert("表达式不能为空!");
} else {
alert(exp);
}
}
6、主界面类MainActivity
package net.hw.expression_calculator;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.widget.EditText;
import android.widget.TextView;
/**
* 功能:表达式计算器
* 比如:3+(4*2-16/3)*2;6*2>56/7
* 作者:华卫
* 日期:2016年11月22日
*/
public class MainActivity extends Activity {
/**
* 网页视图
*/
private WebView webview;
/**
* 输入表达式的文本框
*/
private EditText edtExpression;
/**
* 显示计算结果的标签
*/
private TextView tvResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局资源文件设置用户界面
setContentView(R.layout.activity_main);
// 通过控件资源标识符获得控件实例
webview = (WebView) findViewById(R.id.webview);
tvResult = (TextView) findViewById(R.id.tv_result);
edtExpression = (EditText) findViewById(R.id.edt_expression);
// 设置JavaScript可用
webview.getSettings().setJavaScriptEnabled(true);
// 利用webview加载本地页面
webview.loadUrl("file:///android_asset/calculate.html");
// 设置网页浏览器客户端,能监听到网页弹出警告框
webview.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
/* 创建一个安卓警告对话框 */
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); // 创建警告对话框构建器
// 设置对话框图标
builder.setIcon(R.mipmap.ic_launcher);
if (message.equals("表达式不能为空!")) {
// 设置对话框标题
builder.setTitle("错误提示");
// 设置对话框正文
builder.setMessage(message);
} else {
// 设置对话框标题
builder.setTitle("运算结果");
// 设置对话框正文
builder.setMessage(edtExpression.getText().toString() + " = " + message);
// 设置结果标签内容
tvResult.setText(edtExpression.getText().toString() + " = " + message);
}
// 设置确定按钮
builder.setPositiveButton("确定", null);
// 根据设置创建警告对话框
AlertDialog dialog = builder.create();
// 显示警告对话框
dialog.show();
// 处理用户的确认操作
result.confirm();
// 事件处理完毕
return true;
}
});
}
/**
* 计算按钮单击事件处理方法
*
* @param view
*/
public void doCalculate(View view) {
// 获取用户输入的表达式
String strExpression = edtExpression.getText().toString().trim();
// 利用webview调用JavaScript函数
webview.loadUrl("javascript:calculate(" + strExpression + ")");
}
/**
* 清空按钮单击事件处理方法
*
* @param view
*/
public void doClear(View view) {
// 清空表达式文本框内容
edtExpression.setText("");
// 清空结果标签内容
tvResult.setText("");
// 表达式文本框获取焦点
edtExpression.requestFocus();
}
}
本文分享 CSDN - howard2005。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。