Android开发初试 - 计算器

目录

  • AndroidStudio
  • 简单计算器的实现
  • 遇到的问题及心得体会

开发工具 -AndroidStudio

Android 开发环境大致可分为以下几个部分:

  • jdk 环境配置
    就不多做介绍,下载安装及配置环境变量
  • 编译器
    平常 Java 用的是 IDEA,可以直接在这个里面添加 SDK 和 ADT,eclipse 也是一样

这里看了下知乎,貌似 AndroidStudio 专业一点,自带终端和 logcat 等,专为开发 Android 而生,于是就入坑了。

  • 安装 Android SDK 和 ADT 和 AVD
    安卓的软件开发包就是 Android SDK,可以自己手动安装然后到编译器里面配置也可以直接在 AS 里面一件配置好。

就直接传送门吧,过程比较顺利。对于 ADT 的作用,借用官方的一句话“为了使得 Android 应用的创建,运行和调试更加方便快捷,Android 的开发团队为 IDE 定制了一个插件:Android Development Tools(ADT)。”,安装的过程也就是给编译器添加插件的过程。
AVD 就是一个安卓虚拟机,方便调试,这里也可以插上自己的安卓机来调试

  • 配置 AndroidStudio
    这里弄了两个东西。
  1. 装后发现自己的 C 盘少了好几 G 的空间,这肯定不能忍。这是由于 AS 默认 SDK 和 ADT 的位置是在 C 盘的,参考传送门。
  2. 代码配色:大爱 Solarized Dark 配色
  3. 另外一个好玩的插件:activate-power-mode.jar,感受一下:
  4. 还有几个插件,Sexy Editor(更酷炫的配色)、Translation(AS 内置翻译插件)

整体结构

  • 布局
  • 事件监听
  • 细节调整
  • 编译运行、打包

详细介绍

项目创建好之后,需要对下面两个地方进行操作:

事件监听和计算功能:java/com.XXXXX. 项目名 /MainActivity
布局:res/layout/activity_main.xml

两部分代码如下:

activity_main.xml:

[ccen_xml]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >


        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:orientation="horizontal"
                android:layout_weight="2"
                >

                <TextView
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:id="@+id/et_input"
                        android:textSize="40sp"
                        />
        </LinearLayout>

        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:orientation="horizontal"
                android:weightSum="4"

                >

                <Button
                        android:id="@+id/btn_clear"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1.5"
                        android:autoLink="none"
                        android:background="#D2D7D9"
                        android:text="C"
                        android:textAppearance="@style/TextAppearance.AppCompat.Display1" />

                <Button
                        android:id="@+id/btn_del"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1.5"
                        android:background="#D2D7D9"
                        android:text="CE"
                        android:textAppearance="@style/TextAppearance.AppCompat.Display1" />

                <Button
                        android:id="@+id/btn_divide"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:background="#D2D7D9"
                        android:text="/"
                        android:textAppearance="@style/TextAppearance.AppCompat.Display1" />
        </LinearLayout>
        <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:gravity="center"
                android:weightSum="4"
                >

                <Button
                        android:id="@+id/btn_7"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:background="#fafafa"
                        android:text="7"
                        android:textSize="30sp" />

                <Button
                        android:id="@+id/btn_8"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:background="#fafafa"
                        android:text="8"
                        android:textSize="30sp" />

                <Button
                        android:id="@+id/btn_9"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:background="#fafafa"
                        android:text="9"
                        android:textSize="30sp" />

                <Button
                        android:id="@+id/btn_multiply"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:background="#D2D7D9"
                        android:text="×"
                        android:textAppearance="@style/TextAppearance.AppCompat.Display1" />
        </LinearLayout>
        <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="0dp"
                android:orientation="horizontal"
                android:layout_weight="1"
                android:weightSum="4"
                >

                <Button
                        android:id="@+id/btn_4"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:background="#fafafa"
                        android:text="4"
                        android:textSize="30sp" />

                <Button
                        android:id="@+id/btn_5"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:background="#fafafa"
                        android:text="5"
                        android:textSize="30sp" />

                <Button
                        android:id="@+id/btn_6"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:background="#fafafa"
                        android:text="6"
                        android:textSize="30sp" />

                <Button
                        android:id="@+id/btn_minus"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:background="#D2D7D9"
                        android:text="-"
                        android:textAppearance="@style/TextAppearance.AppCompat.Display1" />
        </LinearLayout>
        <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="0dp"
                android:orientation="horizontal"
                android:layout_weight="1"
                android:weightSum="4"
                >

                <Button
                        android:id="@+id/btn_1"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:background="#fafafa"
                        android:text="1"
                        android:textSize="30sp" />

                <Button
                        android:id="@+id/btn_2"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:background="#fafafa"
                        android:text="2"
                        android:textSize="30sp" />

                <Button
                        android:id="@+id/btn_3"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:background="#fafafa"
                        android:text="3"
                        android:textSize="30sp" />

                <Button
                        android:id="@+id/btn_plus"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:background="#D2D7D9"
                        android:text="+"
                        android:textAppearance="@style/TextAppearance.AppCompat.Display1" />
        </LinearLayout>

        <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="0dp"
                android:orientation="horizontal"
                android:layout_weight="1"
                android:weightSum="4"
                >


                <Button
                        android:id="@+id/btn_0"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="2"
                        android:background="#fafafa"
                        android:text="0"
                        android:textSize="30sp" />


                <Button
                        android:id="@+id/btn_equal"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="2"
                        android:background="#0DA7E7"
                        android:text="="
                        android:textAppearance="@style/TextAppearance.AppCompat.Display1" />

        </LinearLayout>

</LinearLayout>
[/ccen_xml]

MainActivity.java:

package com.example.ice.ariscalculator;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;



public class MainActivity extends AppCompatActivity implements View.OnClickListener{
        Button btn_0,btn_1,btn_2,btn_3,btn_4,btn_5,btn_6,btn_7,btn_8,btn_9,btn_del;
        Button btn_multiply,btn_divide,btn_plus,btn_minus;
        Button btn_clear,btn_equal;
        private TextView et_input;
        boolean clr_flag;    //判断et中是否清空
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                //实例化对象
                setContentView(R.layout.activity_main);
                btn_0= (Button) findViewById(R.id.btn_0);
                btn_1= (Button) findViewById(R.id.btn_1);
                btn_2= (Button) findViewById(R.id.btn_2);
                btn_3= (Button) findViewById(R.id.btn_3);
                btn_4= (Button) findViewById(R.id.btn_4);
                btn_5= (Button) findViewById(R.id.btn_5);
                btn_6= (Button) findViewById(R.id.btn_6);
                btn_7= (Button) findViewById(R.id.btn_7);
                btn_8= (Button) findViewById(R.id.btn_8);
                btn_9= (Button) findViewById(R.id.btn_9);
                btn_plus= (Button) findViewById(R.id.btn_plus);
                btn_minus= (Button) findViewById(R.id.btn_minus);
                btn_multiply= (Button) findViewById(R.id.btn_multiply);
                btn_divide= (Button) findViewById(R.id.btn_divide);
                btn_clear= (Button) findViewById(R.id.btn_clear);
                btn_del= (Button) findViewById(R.id.btn_del);
                btn_equal= (Button) findViewById(R.id.btn_equal);
                et_input= (TextView) findViewById(R.id.et_input);

                //设置按钮的点击事件
                btn_0.setOnClickListener(this);
                btn_1.setOnClickListener(this);
                btn_2.setOnClickListener(this);
                btn_3.setOnClickListener(this);
                btn_4.setOnClickListener(this);
                btn_5.setOnClickListener(this);
                btn_6.setOnClickListener(this);
                btn_7.setOnClickListener(this);
                btn_8.setOnClickListener(this);
                btn_9.setOnClickListener(this);
                btn_plus.setOnClickListener(this);
                btn_minus.setOnClickListener(this);
                btn_multiply.setOnClickListener(this);
                btn_divide.setOnClickListener(this);
                btn_clear.setOnClickListener(this);
                btn_del.setOnClickListener(this);
                btn_equal.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
                String str=et_input.getText().toString();
                switch (v.getId()){
                        case   R.id.btn_0:
                        case   R.id.btn_1:
                        case   R.id.btn_2:
                        case   R.id.btn_3:
                        case   R.id.btn_4:
                        case   R.id.btn_5:
                        case   R.id.btn_6:
                        case   R.id.btn_7:
                        case   R.id.btn_8:
                        case   R.id.btn_9:
                                if(clr_flag){
                                        clr_flag=false;
                                        str="";
                                        et_input.setText("");
                                }
                                et_input.setText(str+((Button)v).getText());
                                break;
                        case R.id.btn_plus:
                        case R.id.btn_minus:
                        case R.id.btn_multiply:
                        case R.id.btn_divide:
                                if(clr_flag){
                                        clr_flag=false;
                                        str="";
                                        et_input.setText("");
                                }
                                if(str.contains("+")||str.contains("-")||str.contains("×")||str.contains("/")) {
                                        str=str.substring(0,str.indexOf(" "));
                                }
                                et_input.setText(str+" "+((Button)v).getText()+" ");
                                break;
                        case R.id.btn_clear:
                                if(clr_flag)
                                        clr_flag=false;
                                str="";
                                et_input.setText("");
                                break;
                        case R.id.btn_del: //判断是否为空,然后在进行删除
                                if(clr_flag){
                                        clr_flag=false;
                                        str="";
                                        et_input.setText("");
                                }
                                else if(str!=null&&!str.equals("")){
                                        et_input.setText(str.substring(0,str.length()-1));
                                }
                                break;
                        case R.id.btn_equal: //单独运算最后结果
                                getResult();
                                break;
                }
        }

        private void getResult(){
                String exp=et_input.getText().toString();
                if(exp==null||exp.equals("")) return ;
                //因为没有运算符所以不用运算
                if(!exp.contains(" ")){
                        return ;
                }
                if(clr_flag){
                        clr_flag=false;
                        return;
                }
                clr_flag=true;
                //截取运算符前面的字符串
                String s1=exp.substring(0,exp.indexOf(" "));
                //截取的运算符
                String op=exp.substring(exp.indexOf(" ")+1,exp.indexOf(" ")+2);
                //截取运算符后面的字符串
                String s2=exp.substring(exp.indexOf(" ")+3);
                double cnt=0;
                if(!s1.equals("")&&!s2.equals("")){
                        double d1=Double.parseDouble(s1);
                        double d2=Double.parseDouble(s2);
                        if(op.equals("+")){
                                cnt=d1+d2;
                        }
                        if(op.equals("-")){
                                cnt=d1-d2;
                        }
                        if(op.equals("×")){
                                cnt=d1*d2;
                        }
                        if(op.equals("/")){
                                if(d2==0) cnt=0;
                                else cnt=d1/d2;
                        }
                        if(!s1.contains(".")&&!s2.contains(".")&&!op.equals("/")) {
                                int res = (int) cnt;
                                et_input.setText(res+"");
                        }else {
                                et_input.setText(cnt+"");}
                }
                //s1不为空但s2为空
                else if(!s1.equals("")&&s2.equals("")){
                        double d1=Double.parseDouble(s1);
                        if(op.equals("+")){
                                cnt=d1;
                        }
                        if(op.equals("-")){
                                cnt=d1;
                        }
                        if(op.equals("×")){
                                cnt=0;
                        }
                        if(op.equals("/")){
                                cnt=0;
                        } else {
                                et_input.setText(cnt+"");}
                }
                //s1是空但s2不是空
                else if(s1.equals("")&&!s2.equals("")){
                        double d2=Double.parseDouble(s2);
                        if(op.equals("+")){
                                cnt=d2;
                        }
                        if(op.equals("-")){
                                cnt=0-d2;
                        }
                        if(op.equals("×")){
                                cnt=0;
                        }
                        if(op.equals("/")){
                                cnt=0;
                        }
                        if(!s2.contains(".")) {
                                int res = (int) cnt;
                                et_input.setText(res+"");
                        }else {
                                et_input.setText(cnt+"");}
                }
                else {
                        et_input.setText("");
                }
        }
}

布局:

采用的是 LinearLayout 线性布局,外层竖线布局内层嵌套横向布局。
外层的竖线线性布局,可以让按钮紧贴,方便调整 Testview 和每个横行的比例关系

android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"

android:orientation="horizontal"

示意图:

颜色的选取是参考 win10 的计算器。
取色技巧:QQ 截屏,鼠标指的位置就会出现 RGB 值

事件监听:

设置按钮点击的事件执行 OnClickListener() -> 里面加入 case 语句为每个按钮设置功能 -> 编写计算部分的函数 (有点乱且没考虑特殊情况,打算在实现多项运算的时候重写)

计算函数大致思路就是读取三组字符串,两个数字以及计算符,对数字字符转换为 double 类型,再做计算。

细节调整:(更改图标或名称)

  1. resdrawable 放置 icon.png(此图片是你需要修改的图标);
  2. 修改 AndroidManifest.xml : android:icon="@drawable/icon"
  3. 编译运行即可。

打包生成 apk:
不多说,直接传送门

遇到的问题有以下几点:

1. 编译好的 APP 放到手机或模拟器闪退

这个东西真的可以把你的脾气全部磨干净~~
找到的原因是:布局里面删掉了按钮,在事件里面只删除了 case 里面的功能,忘记删除实例化对象那部分的代码,无限闪退。
找到原因的办法:logcat 大法!!!!闪退的时候帮我直接定位到了多余的那一行,我就揪出了元凶。

复现闪退情况,logcat 直接给我指出来多少行出了什么错误

2. 导出为 APK,手机安装证书出错

也是反反复复安装失败

新建无数个证书都没用,最后发现选错了选项,如下图:

这里直接选择 v1 就能生成完整带加密的 APK 了,如果选 V2,出错得你怀疑人生

本文链接:https://ariser.cn/index.php/archives/11/
本站文章采用 知识共享署名4.0 国际许可协议进行许可,请在转载时注明出处及本声明!