移动应用开发 计算器基本实现

本文介绍了作者在安卓开发课程中学习的实战过程,重点讲述了使用TableLayout布局实现计算器界面,并详细讲解了数字按钮的事件监听和响应逻辑。作者还讨论了为何选择TableLayout与GridLayout的区别以及如何处理加减乘除等操作。
摘要由CSDN通过智能技术生成

本学期的安卓开发学习课程,我们的老师强调自己敲出来点小应用,而不是依赖他的源码学习,所以老师讲过的布局方法以及界面组件和实现组件动作的监听以及对应的响应反馈内容。这一套组合拳打下来,我也基本学会了简单应用的设计与实现,我第一个会的就是计算器,业务逻辑实现的难度不大,可能细节比较多。界面设计目前采用tableLayout布局方法,我觉得gruidlayot布局方法会就更合适,因为比如等于号可能会独占两列,而表格布局难以实现独占两列的情况。至于组件业绩仅有Button这一种组件,可以粘贴复制,因为组件大小基本都一样,主要需要实现的是业务逻辑,比如加减乘除对应的逻辑实现。

1、主界面设计

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="0"
        android:textSize="30sp"
        android:gravity="right" />
    <TableRow >
        <Button
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="AC"
            android:onClick="clear"/>
        <Button
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="ba"
            android:onClick="backspace"/>
        <Button
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="%"/>
        <Button
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="/"
            android:onClick="opertatorHan"/>
    </TableRow>
    <TableRow >
        <Button
            android:id="@+id/seven"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="7"/>
        <Button
            android:id="@+id/eight"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="8"/>
        <Button
            android:id="@+id/nine"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="9"/>
        <Button
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="*"
            android:onClick="opertatorHan"/>
    </TableRow>
    <TableRow >
        <Button
            android:id="@+id/four"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="4"/>
        <Button
            android:id="@+id/five"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="5"/>
        <Button
            android:id="@+id/six"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="6"/>
        <Button
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="-"
            android:onClick="opertatorHan"/>
    </TableRow>
    <TableRow >
        <Button
            android:id="@+id/one"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="1"/>
        <Button
            android:id="@+id/two"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="2"/>
        <Button
            android:id="@+id/three"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="3"/>
        <Button
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="+"
            android:onClick="opertatorHan"/>
    </TableRow>
    <TableRow >
        <Button
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="#"/>
        <Button
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="0"
            android:onClick="zero"/>
        <Button
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="."/>
        <Button
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginLeft="20dp"
            android:text="="/>
    </TableRow>
</TableLayout>

2、主活动类

package com.example.tablelayouttest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.example.tablelayouttest.utils.StringUtils;

public class MainActivity extends AppCompatActivity {

    private Button one = null;
    private Button two = null;
    private Button three = null;
    private Button four = null;
    private Button five = null;
    private Button six = null;
    private Button seven = null;
    private Button eight = null;
    private Button nine = null;
    private TextView msg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.calculator_main);
        //初始化组件
        initUI();
        //设置数字按钮的监听处理(not include 0)
        setListeners();
    }
    private void initUI()
    {
        one = (Button)findViewById(R.id.one);
        two = (Button)findViewById(R.id.two);
        three = (Button)findViewById(R.id.three);
        four = (Button)findViewById(R.id.four);
        five = (Button)findViewById(R.id.five);
        six = (Button)findViewById(R.id.six);
        seven = (Button)findViewById(R.id.seven);
        eight = (Button)findViewById(R.id.eight);
        nine = (Button)findViewById(R.id.nine);
        msg = (TextView)findViewById(R.id.message);
    }
    private void setListeners()
    {
        NumberListener listener = new NumberListener();
        one.setOnClickListener(listener);
        two.setOnClickListener(listener);
        three.setOnClickListener(listener);
        four.setOnClickListener(listener);
        five.setOnClickListener(listener);
        six.setOnClickListener(listener);
        seven.setOnClickListener(listener);
        eight.setOnClickListener(listener);
        nine.setOnClickListener(listener);
    }
    public void clear(View v)
    {
        msg.setText("0");
    }
    public void backspace(View v)
    {
        //拿到旧字符串
        String old = msg.getText().toString();
        String new_str = old.substring(0, old.length() - 1);
        if(new_str.length() == 0)
        {
            new_str = "0";
        }
        msg.setText(new_str);

    }
    public void zero(View v)
    {
        //拿到旧字符串
        String old = msg.getText().toString();
        if(!"0".equals(old))
        {
            msg.setText(old + "0");
        }
    }
    public void opertatorHan(View v)
    {
        Button btn = (Button)v;
        String old = msg.getText().toString();
        String btn_str = btn.getText().toString();
        String new_str = "";
        String last_old = old.substring(old.length() - 1);
        if(".".equals(last_old) || StringUtils.isOperator(last_old))
        {
            new_str = old.substring(0,old.length() - 1) + btn_str;
        }
        else
        {
            new_str = old + btn_str;
        }
        msg.setText(new_str);
    }
    class NumberListener implements View.OnClickListener
    {

        @Override
        public void onClick(View view) {
            Button b = (Button)view;
            String btn_str = b.getText().toString();
            String old = msg.getText().toString();
            if("0".equals(old))
            {
                msg.setText(btn_str);
            }
            else
            {
                msg.setText(old + btn_str);
            }
        }
    }
}

3、辅助方法类(实现解耦合所以分开写)

package com.example.myapplication;

public class StringUtils {
    /*判断最后一个字符是否是操作符*/
    public static boolean lastIsOperator(String last_old) {
        String []s = {"+","-","*","/"};
        Boolean result = null;
        for(int i=0;i<=s.length;i++){
            if (last_old.equals(s[i]))
                result= true;
            else
                result= false;
        }
        return result;
    }
    /*判断最后一个小数点的位置并比较它与最后一个操作符的位置关系,如果在操作符之前且操作符后是数字则可以添加小数点
    * 如果操作符就是当前字符串的最后一位字符,则拒绝添加小数点*/
    public static String addPinter(String old){
        String new_str = old;
        /*判断最后一个字符是否是操作符*/
       Boolean result = lastIsOperator(old.substring(old.length()-1)) ;
       /*判断最后一个小数点在字符串中的位置*/
        int pinter = 0;/*记录位置的参数*/
        for(int i=old.length()-1;i>=0;i--){
            if(old.charAt(i)=='.') {
                pinter=i;
                break;
            }
        }
        /*判断最后一个操作符在字符串中的位置*/
        int operator = 0;/*记录位置的参数*/
        String []s = {"+","-","*","/"};
        for (int index=old.length()-1;index>=0;index--)
        for (int i=0;i<s.length;i++){
            if(old.charAt(index)==s[i].charAt(0)){
                operator=index;
                break;
            }
        }
        /*是否添加小数点得到新串*/
        if(result){
            new_str = old;
        }else {
            if(pinter<operator){
                new_str = old+".";
            }else {
                new_str = old;
            }
        }
        return new_str;
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ForestSpringH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值