Android计算器编写代码


其实这个安卓计算机,所有的后台思想与《C#计算器编写代码》是一模一样的。Win窗体程序移植到安卓,从C#到Java其实很简单的,因为两者的基本语法都很相像,唯一的难点是安卓的xml布局部分,不像C#窗体能够直接拖。
 还是如下图一个能够完成基本四则运算的计算器: 

先在res\values\strings.xml设置按钮相应的字体,以免布局文件警告满天飞:

 <?xml version="1.0" encoding="utf-8"?>
<resources>

  <string name="app_name">计算器</string>
  <string name="bt_1">1</string>
  <string name="bt_2">2</string>
  <string name="bt_3">3</string>
  <string name="bt_4">4</string>
  <string name="bt_5">5</string>
  <string name="bt_6">6</string>
  <string name="bt_7">7</string>
  <string name="bt_8">8</string>
  <string name="bt_9">9</string>
  <string name="bt_0">0</string>
  <string name="bt_point">.</string>
  <string name="bt_ce">CE</string>
  <string name="bt_plus">+</string>
  <string name="bt_minus">-</string>
  <string name="bt_multi">×</string>
  <string name="bt_div">÷</string>
  <string name="bt_result">=</string>

</resources>

 之后,布局部分采用了《【Android】关于百分比布局多个LinearLayout嵌套时出现的问题与解决方案》(点击打开链接)的思想,具体如下图,一个TextView、一个EditText,皆直接用match_parent占据整行的宽度,之后利用LinearLayout与TableLayout作横向比例的划分。 

因此,res\layout\activity_main.xml具体代码如下,之后的操作要操作的组件加上Id,这里加上《【Android】内存卡图片读取器,图库app》(点击打开链接)的ScrollView是防止某些手机屏幕过少,加上垂直滚动条:

 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
      android:id="@+id/textView1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content" />

    <EditText
      android:id="@+id/editText1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:enabled="false"
      android:inputType="none"
      android:textSize="18sp" />

    <LinearLayout
      android:baselineAligned="false"
      android:layout_width="match_parent"
      android:layout_height="match_parent" >

      <TableLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2" >

        <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content" >

          <Button
            android:id="@+id/bt_7" 
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/bt_7" />

          <Button
            android:id="@+id/bt_8" 
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/bt_8" />

          <Button
            android:id="@+id/bt_9" 
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/bt_9" />
        </LinearLayout>

        <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content" >

          <Button
            android:id="@+id/bt_4" 
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/bt_4" />

          <Button
            android:id="@+id/bt_5" 
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/bt_5" />

          <Button
            android:id="@+id/bt_6"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/bt_6" />
        </LinearLayout>

        <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content" >

          <Button
            android:id="@+id/bt_1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/bt_1" />

          <Button
            android:id="@+id/bt_2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/bt_2" />

          <Button
            android:id="@+id/bt_3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/bt_3" />
        </LinearLayout>

        <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content" >

          <Button
            android:id="@+id/bt_0"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/bt_0" />

          <Button
            android:id="@+id/bt_point"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/bt_point" />
        </LinearLayout>
      </TableLayout>

      <TableLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" >

        <Button
          android:id="@+id/bt_ce"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:text="@string/bt_ce" />

        <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content" >

          <Button
            android:id="@+id/bt_plus"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/bt_plus" />

          <Button
            android:id="@+id/bt_minus"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/bt_minus" />
        </LinearLayout>

        <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content" >

          <Button
            android:id="@+id/bt_multi"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/bt_multi" />

          <Button
            android:id="@+id/bt_div"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/bt_div" />
        </LinearLayout>

        <Button
          android:id="@+id/bt_result"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:text="@string/bt_result" />
      </TableLayout>
    </LinearLayout>
  </LinearLayout>

</ScrollView>

 之后是MainActivity.java没什么好说的,基本与直接Win窗体的《C#计算器编写代码》,将C#改成java是一个很简单的事情。唯一注意的是,这里的按钮比较多,因此不建议像《【Android】利用Java代码布局,按钮添加点击事件》(点击打开链接)一样,使用内部匿名类实现按钮的点击事件,应该让MainActivity实现OnClickListener接口,之后在继承下来的onClick方法,根据传递过来的View v中的id,利用switch-case结构来搞,这样清晰明了。

 package com.calculator;

import java.util.*;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.TextView;
import android.app.Activity;

public class MainActivity extends Activity implements OnClickListener {

 private List<Double> value_list = new ArrayList<Double>();// 存用户输入的数字
 private List<Integer> operator_list = new ArrayList<Integer>();// 存用户输入的运算符,定义+为0,-为1,×为2,÷为3
 // 状态记录
 private boolean add_flag = false;// +按下
 private boolean minus_flag = false;// -按下
 private boolean multi_flag = false;// ×按下
 private boolean div_flag = false;// ÷按下
 private boolean result_flag = false;// =按下
 private boolean can_operate_flag = false;// 按下=是否响应

 private TextView textView1;
 private EditText editText1;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 findViewById(R.id.bt_0).setOnClickListener(this);
 findViewById(R.id.bt_1).setOnClickListener(this);
 findViewById(R.id.bt_2).setOnClickListener(this);
 findViewById(R.id.bt_3).setOnClickListener(this);
 findViewById(R.id.bt_4).setOnClickListener(this);
 findViewById(R.id.bt_5).setOnClickListener(this);
 findViewById(R.id.bt_6).setOnClickListener(this);
 findViewById(R.id.bt_7).setOnClickListener(this);
 findViewById(R.id.bt_8).setOnClickListener(this);
 findViewById(R.id.bt_9).setOnClickListener(this);
 findViewById(R.id.bt_point).setOnClickListener(this);
 findViewById(R.id.bt_ce).setOnClickListener(this);
 findViewById(R.id.bt_plus).setOnClickListener(this);
 findViewById(R.id.bt_minus).setOnClickListener(this);
 findViewById(R.id.bt_multi).setOnClickListener(this);
 findViewById(R.id.bt_div).setOnClickListener(this);
 findViewById(R.id.bt_result).setOnClickListener(this);
 textView1 = (TextView) findViewById(R.id.textView1);
 editText1 = (EditText) findViewById(R.id.editText1);

 }

 @Override
 public void onClick(View v) {
 switch (v.getId()) {
 case R.id.bt_0:
  num_down("0");
  break;
 case R.id.bt_1:
  num_down("1");
  break;
 case R.id.bt_2:
  num_down("2");
  break;
 case R.id.bt_3:
  num_down("3");
  break;
 case R.id.bt_4:
  num_down("4");
  break;
 case R.id.bt_5:
  num_down("5");
  break;
 case R.id.bt_6:
  num_down("6");
  break;
 case R.id.bt_7:
  num_down("7");
  break;
 case R.id.bt_8:
  num_down("8");
  break;
 case R.id.bt_9:
  num_down("9");
  break;
 case R.id.bt_point:
  num_down(".");
  break;
 case R.id.bt_plus:
  if (!add_flag)// 防止用户多次输入一个符号键,符号键只允许输入一次
  {
  result_flag = false;
  value_list.add(Double.parseDouble(editText1.getText()
   .toString()));// 将当前已输入的数字放入value_list
  operator_list.add(0);
  textView1.setText(textView1.getText() + "+");
  add_flag = true;
  can_operate_flag = false;// 刚刚输入完符号,不能构成一条正常的表达式,如111+,设置为不可运行状态
  }
  break;
 case R.id.bt_minus:
  if (!minus_flag) {
  result_flag = false;
  value_list.add(Double.parseDouble(editText1.getText()
   .toString()));
  operator_list.add(1);
  textView1.setText(textView1.getText() + "-");
  minus_flag = true;
  can_operate_flag = false;
  }
  break;
 case R.id.bt_multi:
  if (!multi_flag) {
  result_flag = false;
  value_list.add(Double.parseDouble(editText1.getText()
   .toString()));
  operator_list.add(2);
  textView1.setText("(" + textView1.getText() + ")×");// 给前面的已经输入的东西加个括号。(运算符栈问题是一个很复杂的数据结构问题,这里不做,:P)
  multi_flag = true;
  can_operate_flag = false;
  }
  break;
 case R.id.bt_div:
  if (!div_flag) {
  result_flag = false;
  value_list.add(Double.parseDouble(editText1.getText()
   .toString()));
  operator_list.add(3);
  textView1.setText("(" + textView1.getText() + ")÷");
  div_flag = true;
  can_operate_flag = false;
  }
  break;
 case R.id.bt_result:
  if (value_list.size() > 0 && operator_list.size() > 0
   && can_operate_flag) {// 需要防止用户没输入数字,或者只输入了一个数,就按=。
  value_list.add(Double.parseDouble(editText1.getText()
   .toString()));
  double total = value_list.get(0);
  for (int i = 0; i < operator_list.size(); i++) {
   int _operator = operator_list.get(i);// operator是C#的运算符重载的关键字,前面加个_来区别
   switch (_operator) {
   case 0:
   total += value_list.get(i + 1);
   break;
   case 1:
   total -= value_list.get(i + 1);
   break;
   case 2:
   total *= value_list.get(i + 1);
   break;
   case 3:
   total /= value_list.get(i + 1);
   break;
   }
  }
  editText1.setText(total + "");
  textView1.setText(total + "");
  operator_list.clear();// 算完,就清空累积数字与运算数组
  value_list.clear();
  result_flag = true;// 表示=按下
  }
  break;
 case R.id.bt_ce:
  operator_list.clear();
  value_list.clear();
  add_flag = false;
  minus_flag = false;
  multi_flag = false;
  div_flag = false;
  result_flag = false;
  can_operate_flag = false;
  editText1.setText("");
  textView1.setText("");
  break;
 }
 }

 // 数字键按下,含0与.,类似000001223这类情况这里允许,因为java可以讲000001223自己转化为1223
 private void num_down(String num) {
 if (add_flag || minus_flag || multi_flag || div_flag || result_flag) {
  if (result_flag)// 按下等号,刚刚算完一个运算的状态
  {
  textView1.setText("");
  }
  editText1.setText("");// 如果用户刚刚输入完一个运算符
  add_flag = false;
  minus_flag = false;
  multi_flag = false;
  div_flag = false;
  result_flag = false;
 }
 if ((num.equals(".") && editText1.getText().toString().indexOf(".") < 0)
  || !num.equals(".")) {
  // 如果用户输入的是小数点.,则要判断当前已输入的数字中是否含有小数点.才允许输入
  editText1.setText(editText1.getText() + num);
  textView1.setText(textView1.getText() + num);
  can_operate_flag = true;
 }
 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持phpstudy。



相关阅读:
基于C#的电视台节目表接口调用代码
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
基于jquery实现的可编辑下拉框实现代码
jQuery自定义数值抽奖活动代码
http图片上传安全性问题 根据ContentType (MIME) 判断其实不准确、不安全
使用ajax技术实现txt弹出在页面上的方法
Adobe Reader因不再吸引Linux用户决定退出Linux系统
div标签中的元素margin-top失效的解决方法
使用PHP导出Redis数据到另一个Redis中的代码
ASP.NET两个截取字符串的方法分享
node.js中的http.response.write方法使用说明
升级到Win10系统需要知道的7件事
PHP实现微信网页授权开发教程
jQuery找出网页上最高元素的方法
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 CMS SQL jQuery C# C++ java Android IOS oracle MongoDB PostgreSQL SQLite 交通频道 G4722 G1875 G215 G569 G421 G6733 G7577 G8906 G1235 G4916 G7291 G1953 G245 G662 G1570 G6285 G719 G1836 G1346 G4781 G4908 G289 G6781 G9290 G7358 G1928 G1815 G325 G132 G4901 G6012 G6290 G7131 G5367 G184 G151 G5303 G1136 G6481 G7028 G575 G1744 G7660 G7693 G2344 G4937 G1234 G1814 G6252 G1492 G253 G2926 G883 G9275 G1231 G556 G241 G1306 G7646 G8103 G600 G1858 G9678 G6160 G7156 G825 G1125 G7249 G1809 G1350 G432 G9466 G7067 G785 G6404 G4663 G7008 G150 G823 G1514 G7529 G1201 G2353 G205 G7629 G9409 G6147 G677 G390 G8016 G9239 G456 G828 G8045 G491 G7145 G397 G7012 G1021 G6482 G2322 G7264 G1301 G9247 G96 G1294 G7133 G4824 G7005 G1653 G5307 G1213 G822 G4837 G1422 G411 G6227 G1571 G359 G1882 G6074 G7678 G21 G7077 G1272 G8918 G9645 G461 G1254 G1846 G8021 G7303 G1104 G76 G82 G621 G218 G8533 G2341 G8543 G555 G8013 G4802 G1364 G1153 G1342 G1861 G8905 G590 G4780 G668 G9261 G1304 G1638 G1395 G2914 G8003 G7158 G1833 G1873 G8128 G1856 G1841 G8709 G7346 G4612 G2103 G835 G8712 G381 G7240 G8932 G507 G29 G4054 G6273 G6752 G426 G211 G9473 G7119 G2333 G1567 G6153 G360 G4011 G5301 G7648 G8010 G8015 G6706 G614 G423 G8557 G9465 G72 G6018 G8901 G7030 G123

丹东 云霄 辽中 德阳 克拉玛依 惠山 招远 昭通 铁岭西 延吉西 军粮城北 定西 晋中 许昌东 郫县 诏安 七台河 高碑店东 南昌 延安 敦化 铜陵北 嵩明 鲘门 扬中 龙里北 舟山 洛阳 运城北 鞍山 西昌 邵阳北 绍兴 白山 三明 肇东 陵水 衡山西 嘉善 宜都 泰兴 泉州 汉口 东胜西 昌图西 锦州南 安阳东 怀化 黄南 亚龙湾 扬州 温州 南翔北 福安 金山北 永川东 安达 曲阜东 郑州西 天门 绍兴北 涪陵北 阳泉北 三亚 葫芦岛北 徐州 阳江 辽源 新泰 阿坝 孝感北 三穗 金寨 保山 高安 安阳 牟平 西双版纳 信阳 繁昌西 哈尔滨北 达州 新余 沈阳南 四平 扶余北 伊宁 郴州西 济源 水家湖 民权北 福鼎 如皋 奉化 全州南 安庆 太姥山 武汉 乐清 皮口 武昌 茂名 邯郸 资阳 马鞍山 三水南 泰安 包头东 衡阳东 南丰 仙桃西 安吉 罗源 山海关 平湖 惠州 资阳北 淄博 丹阳 莱州 巴东 关岭 盐城 锦州 格尔木 益阳 大英东 吉林 湛江 临安 襄汾西 渑池南 当涂东 辽阳 徐水 贺州 韶关 光明城 邯郸东 普安县 南江口 铜川 五龙背东 张家港 烟台南 萍乡北 青堆 长乐 江门 台州 衡水 湘潭北 闽清北 高邑西 盖州西 石柱县 潮汕 肇庆 泰康 邵东 湖州 余姚 平凉 宜宾 增城 沧州 都匀 防城港 鹰潭北 海东西 福田 余姚北 岳池 广州北 南安 蓬莱 瓦房店西 李石寨 葛店南 海安 无锡东 上饶 通辽 四会 桂林西 砀山南 兰州 滨海 龙口 绅坊 莱西 石林西 深圳 大连北 成都 上海西 孝感 杏树屯 德清 嘉兴

Copyright © 2016 phpStudy |