Android学习笔记(九):练习项目-简易计算器

使用Android studio制作简易计算器界面 【代码】使用Android studio制作简易计算器界面。 阅读详情

        计算器界面如下

一、创建empty activity

Android学习笔记(一):创建empty activityicon-default.png?t=N7T8https://blog.youkuaiyun.com/CJ_study/article/details/133780409?spm=1001.2014.3001.5501

二、设置界面

1、values/themes.xml 修改主题

        由于默认的主题不太好看,这里可以修改主题,如下所示,修改为

"Theme.MaterialComponents.DayNight.DarkActionBar.Bridge"

这里暂不对其进行解释。

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Base.Theme.Calculator" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
        <!-- Customize your light theme here. -->
        <!-- <item name="colorPrimary">@color/my_light_primary</item> -->
    </style>

    <style name="Theme.Calculator" parent="Base.Theme.Calculator"/>
</resources>

2、layout/activity_main.xml 设置布局、添加组件

完整代码

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="@dimen/calculator_padding"
        android:text="@string/app_name"
        android:textSize="@dimen/calculator_text_size" />

    <TextView
        android:id="@+id/calculator_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:gravity="end|bottom"
        android:lines="@integer/calculator_text_lines"
        android:text="@string/calculator_0"
        android:textColor="@color/black"
        android:textSize="@dimen/calculator_text_size" />

    <GridLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:columnCount="4">

        <Button
            android:id="@+id/calculator_ce"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_ce"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_division"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_division"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_multiplication"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_multiplication"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_empty"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_empty"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_7"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_7"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_8"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_8"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_9"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_9"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_add"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_add"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_4"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_4"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_5"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_5"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_6"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_6"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_subtraction"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_subtraction"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_1"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_1"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_2"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_2"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_3"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_3"
            android:textSize="@dimen/calculator_button_font_size" />

        <ImageButton
            android:id="@+id/evolution"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:scaleType="fitCenter"
            android:src="@drawable/evolution" />

        <Button
            android:id="@+id/calculator_reciprocal"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_reciprocal"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_0"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_0"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_point"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_point"
            android:textSize="@dimen/calculator_button_font_size" />

        <Button
            android:id="@+id/calculator_equal"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_equal"
            android:textSize="@dimen/calculator_button_font_size" />
    </GridLayout>


</LinearLayout>

        接下来分块讲解:

2.1、线性布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/calculator_background"
    android:orientation="vertical">

</LinearLayout>

        在最外层是线性布局,设置宽高属性为"match_parent",匹配界面;并通过background设置背景颜色,将颜色的值定义在colors.xml文件中;属性orientation设置对齐方式,"vertical"为垂直方向; Android学习笔记(五):设置视图宽高、间距、对齐方式icon-default.png?t=N7T8https://blog.youkuaiyun.com/CJ_study/article/details/134109289?spm=1001.2014.3001.5501

Android学习笔记(六):常用布局--LinearLayout线性布局、RelativeLayout相对布局、GridLayout网格布局、ScrollView滚动视图icon-default.png?t=N7T8https://blog.youkuaiyun.com/CJ_study/article/details/134347692?spm=1001.2014.3001.5501

2.2、TextView 显示文本内容

    <TextView
        android:id="@+id/calculator_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:gravity="end|bottom"
        android:lines="@integer/calculator_text_lines"
        android:text="@string/calculator_0"
        android:textColor="@color/black"
        android:textSize="@dimen/calculator_text_size" />

        这个TextView组件主要是用来输入内容和计算结果。通过id="@+id/calculator_content"给这个组件添加id,在java逻辑就可以对它进行操作;设置宽高,宽"match_parent"匹配上级布局,高"wrap_content"自适应内容设置;通过gravity="end|bottom"属性设置内容对齐方式,这里采用右下的对齐方式;lines属性设置显示的行数,我在integers.xml中定义了行数3;text属性设置显示默认内容,可以通过java逻辑修改其内容;textColor设置字体颜色,textSize设置字体尺寸,并在dimens.xml文件中统一定义各种尺寸;

2.3、GridLayout 网格布局

<GridLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:columnCount="4">

</GridLayout>

        这里网格布局主要通过columnCoun设置列数,行数会根据组件数量自动添加;

Android学习笔记(六):常用布局--LinearLayout线性布局、RelativeLayout相对布局、GridLayout网格布局、ScrollView滚动视图icon-default.png?t=N7T8https://blog.youkuaiyun.com/CJ_study/article/details/134347692?spm=1001.2014.3001.5501

2.4、Button 按钮

        <Button
            android:id="@+id/calculator_ce"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:text="@string/calculator_ce"
            android:textSize="@dimen/calculator_button_font_size" />

        通过id属性添加id,可以在java逻辑中对其进行操作;宽设置为0,并通过layout_columnWeight属性设置其权重,这样在网格布局中各个组件的宽度根据权重平分;然后高度也设置为定值,这样每个组件就一样的大小;layout_margin属性设置当前组件与上一级或平级组件之间的间隔;

Android学习笔记(七):按钮Button的常用方法icon-default.png?t=N7T8https://blog.youkuaiyun.com/CJ_study/article/details/135581554?spm=1001.2014.3001.5501

2.5、ImageButton 图形按钮

        <ImageButton
            android:id="@+id/evolution"
            android:layout_width="0dp"
            android:layout_height="@dimen/calculator_button_height"
            android:layout_columnWeight="1"
            android:layout_margin="@dimen/calculator_button_margin"
            android:scaleType="fitCenter"
            android:src="@drawable/evolution" />

        因为根号需要通过图像显示,所以这里用到图形按钮,所以图形按钮的一个特点就是文字无法描述的内容可以通过图形的形式展示;scaleType属性设置图形的缩放比例;src属性设置图形的来源,图片放在drawable/ 目录下。

Android学习笔记(八):ImageView加载图片与ImageButton图形按钮icon-default.png?t=N7T8https://blog.youkuaiyun.com/CJ_study/article/details/135714563?spm=1001.2014.3001.5501

3、values/strings.xml 定义内容 

<resources>
    <string name="app_name">Calculator</string>
    <string name="calculator_ce">CE</string>
    <string name="calculator_division">÷</string>
    <string name="calculator_multiplication">×</string>
    <string name="calculator_empty">C</string>
    <string name="calculator_add">+</string>
    <string name="calculator_subtraction">-</string>
    <string name="calculator_equal">=</string>
    <string name="calculator_point">.</string>
    <string name="calculator_reciprocal">1/X</string>

    <string name="calculator_0">0</string>
    <string name="calculator_1">1</string>
    <string name="calculator_2">2</string>
    <string name="calculator_3">3</string>
    <string name="calculator_4">4</string>
    <string name="calculator_5">5</string>
    <string name="calculator_6">6</string>
    <string name="calculator_7">7</string>
    <string name="calculator_8">8</string>
    <string name="calculator_9">9</string>

</resources>

4、values/colors.xml 定义颜色

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="black">#FF000000</color>
    <color name="white">#FFFFFFFF</color>
    <color name="calculator_background">#FFEEEEEE</color>
</resources>

5、values/dimens.xml 定义尺寸

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="calculator_text_size">30sp</dimen>
    <dimen name="calculator_padding">5dp</dimen>
    <dimen name="calculator_button_font_size">30sp</dimen>
    <dimen name="calculator_button_height">75dp</dimen>
    <dimen name="calculator_button_margin">3dp</dimen>
</resources>

可能默认创建的项目中没有这个文件,手动新建一个xml文件并命名为dimens;

6、values/integers.xml 定义数字常量

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="calculator_text_lines">3</integer>
</resources>

        定义这些值在这些文件中统一管理,方便修改。

三、MainActivity 实现java逻辑

完整代码

package com.example.calculator;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity
        implements View.OnClickListener {
    /* 简易计算器
     *  最多只支持2个数字的计算
     *  不符合格式的数字不进行计算
     */
    private final String TAG = "Calculator";
    private Button m_btn_CE; // 回退键
    private Button m_btn_division; // 除法键
    private Button m_btn_multiplication; // 乘法键
    private Button m_btn_empty; // 清空键
    private Button m_btn_add; // 加法键
    private Button m_btn_subtraction; // 减法键
    private ImageButton m_image_btn_evolution; // 根号键
    private Button m_btn_reciprocal; // 倒数键
    private Button m_btn_point; // 小数点键
    private Button m_btn_equal; // 等于键
    private Button m_btn_0;
    private Button m_btn_1;
    private Button m_btn_2;
    private Button m_btn_3;
    private Button m_btn_4;
    private Button m_btn_5;
    private Button m_btn_6;
    private Button m_btn_7;
    private Button m_btn_8;
    private Button m_btn_9;
    private TextView m_textview_content; // 显示内容
    private StringBuilder m_sb_ShowText; // 保存输入内容
    private StringBuilder m_sb_ans; // 保存计算结果
    private int m_method_index; // 保存计算符号位置

    @Override
    protected void onCreate(Bundle savedInstanceState) { // 进入应用
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData(); // 初始化数据
        initUI(); // 加载初始化界面布局
        setClickListener(); // 设置监听
    }

    private void initData() { // 初始化数据
        m_sb_ShowText = new StringBuilder();
        m_sb_ans = new StringBuilder();
        m_method_index = -1; /* -1 表示未添加计算符号 */
        Log.i(TAG, "initData is ok!");
    }

    private void initUI() { // 加载初始化界面布局
        /* 其实这里可以进行优化一下代码
         * 如:findViewById(R.id.calculator_ce).setOnClickListener(this);
         * 因为整个程序中都没有对m_btn_CE进行其它操作,所以可以不用单独定义一个变量;
         * 只需要对这个按钮设置监听即可;
         * m_textview_content 在后面需要操作,所以要单独定义成一个变量 */
        m_btn_CE = findViewById(R.id.calculator_ce);
        m_btn_division = findViewById(R.id.calculator_division);
        m_btn_multiplication = findViewById(R.id.calculator_multiplication);
        m_btn_empty = findViewById(R.id.calculator_empty);
        m_btn_add = findViewById(R.id.calculator_add);
        m_btn_subtraction = findViewById(R.id.calculator_subtraction);
        m_image_btn_evolution = findViewById(R.id.evolution);
        m_btn_reciprocal = findViewById(R.id.calculator_reciprocal);
        m_btn_point = findViewById(R.id.calculator_point);
        m_btn_equal = findViewById(R.id.calculator_equal);
        m_btn_0 = findViewById(R.id.calculator_0);
        m_btn_1 = findViewById(R.id.calculator_1);
        m_btn_2 = findViewById(R.id.calculator_2);
        m_btn_3 = findViewById(R.id.calculator_3);
        m_btn_4 = findViewById(R.id.calculator_4);
        m_btn_5 = findViewById(R.id.calculator_5);
        m_btn_6 = findViewById(R.id.calculator_6);
        m_btn_7 = findViewById(R.id.calculator_7);
        m_btn_8 = findViewById(R.id.calculator_8);
        m_btn_9 = findViewById(R.id.calculator_9);
        m_textview_content = findViewById(R.id.calculator_content);
        Log.i(TAG, "initUI is ok!");
    }

    private void setClickListener() { // 设置监听
        m_btn_CE.setOnClickListener(this);
        m_btn_division.setOnClickListener(this);
        m_btn_multiplication.setOnClickListener(this);
        m_btn_empty.setOnClickListener(this);
        m_btn_add.setOnClickListener(this);
        m_btn_subtraction.setOnClickListener(this);
        m_image_btn_evolution.setOnClickListener(this);
        m_btn_reciprocal.setOnClickListener(this);
        m_btn_point.setOnClickListener(this);
        m_btn_equal.setOnClickListener(this);
        m_btn_0.setOnClickListener(this);
        m_btn_1.setOnClickListener(this);
        m_btn_2.setOnClickListener(this);
        m_btn_3.setOnClickListener(this);
        m_btn_4.setOnClickListener(this);
        m_btn_5.setOnClickListener(this);
        m_btn_6.setOnClickListener(this);
        m_btn_7.setOnClickListener(this);
        m_btn_8.setOnClickListener(this);
        m_btn_9.setOnClickListener(this);
        Log.i(TAG, "setClickListener is ok!");
    }

    @Override
    public void onClick(View view) {
        // 通过view.getId()获取到当前点击的按钮的id;并进行对应的操作
        if (view.getId() == R.id.calculator_empty) { // 清空操作
            emptyText();
        } else if (view.getId() == R.id.calculator_ce) { // 回退操作
            if (m_sb_ShowText.length() != 0) {
                CEFreshMethod(m_sb_ShowText.charAt(m_sb_ShowText.length() - 1));
                m_sb_ShowText.deleteCharAt(m_sb_ShowText.length() - 1);
            } else
                emptyText();
        } else if (view.getId() == R.id.calculator_equal) { // 等于操作
            try {
                double ans = equal();
                emptyText();
                m_sb_ans.append(ans);
            } catch (Exception e) {
                Log.e(TAG, "equal is failed!");
                return;
            }
        } else if (view.getId() == R.id.calculator_1 ||
                view.getId() == R.id.calculator_2 ||
                view.getId() == R.id.calculator_3 ||
                view.getId() == R.id.calculator_4 ||
                view.getId() == R.id.calculator_5 ||
                view.getId() == R.id.calculator_6 ||
                view.getId() == R.id.calculator_7 ||
                view.getId() == R.id.calculator_8 ||
                view.getId() == R.id.calculator_9 ||
                view.getId() == R.id.calculator_0 ||
                view.getId() == R.id.calculator_point) { // 数字和小数点直接添加到内容中
            appendText(((TextView) view).getText().toString());
        } else if (view.getId() == R.id.evolution && isDouble()) { // 根号操作
            /* 根号操作需要判断当前内容是否为数字
             * 计算完成后,清空内容,添加答案 */
            double num = Double.parseDouble(m_sb_ShowText.toString());
            double evolution_ans = Math.sqrt(num);
            emptyText();
            m_sb_ans.append(evolution_ans);
        } else if (view.getId() == R.id.calculator_add ||
                view.getId() == R.id.calculator_division ||
                view.getId() == R.id.calculator_multiplication ||
                view.getId() == R.id.calculator_subtraction) { // 添加计算符号
            /* 这里没有限制添加计算符号
             * 但记录了符号的位置
             * 如果m_method_index == -1 说明未添加符号,或者符号被回退,因此记录当前符号的位置;
             * 如果m_method_index == 0 说明在内容最前面添加了一个符号,考虑到可能是正负号,
             * 因此再记录当前符号位置作为计算符号;
             * 如果m_method_index > 0 说明添加了计算符号,后面再添加的符号都属于非法符号,不做记录 */
            appendText(((TextView) view).getText().toString());
            if (m_method_index <= 0) {
                m_method_index = m_sb_ShowText.length() - 1;
                Log.i(TAG, "current m_method_index = " + m_method_index);
            }
        } else if (view.getId() == R.id.calculator_reciprocal && isDouble()) { // 倒数操作
            double reciprocal_ans = 1 / Double.parseDouble(m_sb_ShowText.toString());
            emptyText();
            m_sb_ans.append(reciprocal_ans);
        }
        flashText();
    }

    private void CEFreshMethod(char charAt) {
        /* 回退时,刷新计算符号的位置;
         * 考虑到可能输入多个符号,只有当回退了m_method_index记录的符号时才刷新为 -1
         * */
        if (m_method_index != m_sb_ShowText.length() - 1)
            return;
        switch (charAt) {
            case '+':
            case '-':
            case '×':
            case '÷':
                m_method_index = -1;
                Log.i(TAG, "current m_method_index = " + m_method_index);
                break;
        }
    }

    private boolean isDouble() {
        /* 判断当前输入内容是否可以转换为数字
         * 这里用到了try,如果解析到的内容非数字,会抛出异常
         * 异常处理返回false
         * 我这里采用偷懒的方法,也可以编写判断是否为数字的方法 */
        try {
            Double.parseDouble(m_sb_ShowText.toString());
            return true;
        } catch (NumberFormatException e) {
            Log.e(TAG, "current m_sb_ShowText is no Double, (" + m_sb_ShowText.toString() + ")");
            return false;
        }
    }

    private double equal() {
        /* 计算结果
         * 获取第一个数字、计算符号、第二个数字*/
        double first = Double.parseDouble(m_sb_ShowText.substring(0, m_method_index));
        char method = m_sb_ShowText.charAt(m_method_index);
        double second = Double.parseDouble(m_sb_ShowText.substring(m_method_index + 1, m_sb_ShowText.length()));
        switch (method) {
            case '+':
                return first + second;
            case '-':
                return first - second;
            case '×':
                return first * second;
            case '÷':
                return first / second;
            default:
                Log.w(TAG, "the method is other!");
                return 0;
        }
    }

    private void emptyText() {
        /* 清空内容、结果、并初始化符号位置 */
        m_sb_ShowText.setLength(0);
        m_sb_ans.setLength(0);
        m_method_index = -1;
        Log.i(TAG, "emptyText is ok!");
    }

    private void appendText(String text) {
        /* 添加输入内容到m_sb_ShowText中显示出来 */
        m_sb_ShowText.append(text);
        Log.i(TAG, "current m_sb_ShowText = " + m_sb_ShowText.toString());
    }

    private void flashText() {
        /* setText设置内容TextView显示内容
         * 刷新输出内容,在m_textview_content界面显示出来
         * m_sb_ShowText不等于0,说明还在输入,显示输入内容
         * m_sb_ans不等于0,说明得到结果,输出结果
         * 都为0,默认输出显示 0 */
        if (m_sb_ShowText.length() != 0)
            m_textview_content.setText(m_sb_ShowText.toString());
        else if (m_sb_ans.length() != 0)
            m_textview_content.setText(m_sb_ans.toString());
        else
            m_textview_content.setText("0");
    }
}

        代码中已经进行了部分注解,应该可以帮助你理解,这里就不再分步解释了;当然,这个项目中还存在一些BUG,大家可以对其进行优化改进;大家也可以自己尝试去编写,用自己的逻辑实现;其次,这个项目主要是加深前几章内容的理解,大家不要太深究其逻辑实现,在后续的学习中再进一步探究。

Android学习笔记(七):按钮Button的常用方法icon-default.png?t=N7T8https://blog.youkuaiyun.com/CJ_study/article/details/135581554?spm=1001.2014.3001.5501Android学习笔记(八):ImageView加载图片与ImageButton图形按钮icon-default.png?t=N7T8https://blog.youkuaiyun.com/CJ_study/article/details/135714563?spm=1001.2014.3001.5501

1、Log 日志

        我在代码中添加了部分Log日志,可以方便在实现逻辑中,遇到错误或者逻辑不通时,可以通过Log日志帮助我们分析定位代码逻辑。如下图所示,因为定义了TAG为calculator,可以筛选需要的日志查看,i可以表示重要日志,e表示错误日志,w表示警告日志;希望大家可以学会用日志分析,在工作中是一个重要的技能。

四、总结

        本章实现了一个训练项目--简易计算器,可以对前几章学习内容进行复习巩固,加深理解。

【Android】安卓野路子学习项目之Android计算器(一)——界面布局 圆角矩形参考站内作者:jackiesky1206的文章使用软件:Android studio 的 2022.3.1 Patch 1 版本。 阅读详情

相关推荐

用Android Studio制作一个简易的计算器

用Android Studio制作一个简易的计算器 一,前言 虽然现在我们日常生活中很少用到计算器,但在一些数学题或者物理题目上还是非常有帮助的,所以我就想在Android Studio上做一个计算器 二,代码部分 1,显示部分(activity_main.xml) grid layout的一些使用属性 <GridLayout android:id="@+id/gridlayout" android:layout_width="match_parent" android:lay

HeimuZ的博客 6138

Android简单美观计算器(界面部分)

问题描述: 制作一个简单的计算器,实现计算功能 问题分析:

这里是努力做好AC吧 9802

Android项目——简易计算器

编译环境介绍 编译器为:Android studio 3.1.2; SDK API 27 Android 8.1(Oreo); java version jdk-11.0.2; UI设计 界面采用网格布局,在界面设计区域设置一个6行4列的网格布局,第一行为显示数据的文本标签,第2行为清楚数据的按钮,第3~6行均划分为4列,共安排16个按钮,分别代表数字0、1、2...、9及加、减、乘、...

i273627658的博客 2119

Android实现计算器布局(表格布局)

一:表格布局(TableLayout ) 二:表格布局属性 三:效果图 四:样式(Values下的styles.xml) <style name="ButtonStyle" > <item name="android:radius">10dp</item> <item name="android:textStyle"&...

孤夜的博客 9330

安卓开发之简易计算器教程

真·简易计算器,只支持两个整型数据进行简单的加减乘除四则运算,仅作为熟悉安卓开发的练手项目。 一共包括两个界面,一是主界面,如图1-1所示,是计算器的主体部分,二是选择运算符界面,如图1-2所示。 1-1主界面 1-2选择界面 主界面代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ap

qq_40174589的博客 1660

idea编写的安卓Android项目,计算器

idea编写的安卓Android项目,计算器简介项目展示代码页面 简介 用idea编写的安卓项目 项目展示 代码页面 activity_calculator.xml <?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.

loveme520o的博客 1176

【Android应用开发之前端——简单计算器效果】

用Android Studio最快速完成简单的计算器功能

Wistain的博客 5247

【Android】简易计算器实现

一、实验要求: 1、界面设计 2、设计并实现计算器的具体功能,如加减乘除等 3、完成开发日志(代码需有注释) 二、实验过程: 1、界面设计: ①布局:采用嵌套式布局结构,内外层分别使用横向和竖向的LinearLayout设计,使界面更加简洁美观 ②源代码: &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;!--竖向排列--&gt;...

zcy201611671229的博客 914

Android Studio简易计算器

随着移动互联网的普及,手机应用程序已经成为人们生活中不可或缺的一部分。计算器是一类被广泛使用的应用程序之一,因此学习如何开发一款简易的计算器应用程序是学习Android Studio开发的一个很好的开始。是一款Google开发的用于创建安卓应用的集成开发环境(IDE), 它可以帮助开发者快速设计、开发和测试应用程序。接下来我将为大家介绍如何使用Android Studio创建一个简易的计算器应用程序。

weixin_68155905的博客 1万+

基于32nm CMOS工艺的传输门D触发器设计及HSPICE仿真分析

根据半导体集成电路、利用Hspice软件以及数字电路等课程的知识,使用集成电路CMOS工艺完成触发器的设计,帮助初学者熟悉和掌握集成电路芯片电路设计及模拟方法和技巧

2302_81301620的博客 2452

告别手动翻页!用幻影联动+DLL调用,5分钟搞定通达信分时指标自动选股

本文详细介绍了如何利用幻影联动软件结合DLL调用技术,实现通达信分时指标的自动化选股。通过改造指标代码和配置幻影联动任务,用户可以在5分钟内完成从信号检测到自动报警的全流程,大幅提升短周期交易的效率和准确性。

weixin_42561040的博客 767

【Android】简易计算器

【Android】简易计算器

m0_50115641的博客 6641

PSIM联合VS--C++实现正弦波发生

在利用VS联合PSIM仿真中,想要用VS构建一个正弦波发生模块。可以利用Sin函数进行编写,重点是需要编写一个计数器程序。首先打算用for循环语句来构建计数器,但在for循环运行时无法跳出,不能实时获得计数器的值。同理,while循环也无法实现。最后将count变量设置为static型,解决了这一问题。 体现出对于c++程序的运行不够了解,需要多进行程序的编写和调试。 //时钟计数器 static int count = 0; count++; if (count > Sinfre)

weixin_41850228的博客 1087

【Android Studio】简易计算器

简易计算器要求: 1,操作简单,易于掌握,界面简单。 2.方便进行加,减,乘,除等操作。数字保留小数点后两位。 3.包含小数点运算和输入回退功能。 4.能够进行多次叠加运算。 5.系统能够进行多次叠加运算。 6.系统可以稳定运行。 功能图如下: 逻辑流程图如下: 项目建立 项目的创建。 新建项目:项目名称设置为MainActicity。 在Activity模板中选择Blank Activity或者empty Activity模板。 其余操作不变,完成项目的创建。 计算器主界面的实现 1.设计界面布局XM

gelly_的博客 8015

PCL 改进快速欧式聚类【2025最新版】

在FEC: Fast Euclidean Clustering for Point Cloud Segmentation一文的基础上对算法进行改进。博客长期更新,本文最近更新时间为:2025年9月16日。

点云侠的博客 2569

vue2/3 - 详细对接海康监控实时视频预览和录像回放功能,vue接入使用海康视频监控播放器实时推流等功能,支持hik/rtsp/rtmp/hls/ws取流协议(详细教程与示例代码,一键复制开箱即用

vue2,vue3,海康,vue海康视频监控,海康开放平台,如何接入海康的实时监控,海康威视,Vue实现海康监控视频播放,vue3对接海康视频监控播放、回放的方法流程,实现海康H5视频插件播放视频的实例,web网页接入海康,海康威视的视频vue的录像回放和实时预览,前端vue3项目接入海康威视h5player.js播放器,vue2接入海康威视视频监控平台,使用海康监控H5视频播放,对接海康视频监控,海康视频web插件,web前端在vue中通过海康插件嵌入视频,实现实时预览,vue3海康监控播放器组件,vue

✅ 精选推荐文章 1万+

Android 实战项目:简单计算器

本次主要介绍了App开发中常见简单控件的用法,包括:在文本视图上显示文本(设置文本的内容、大小和颜色)、修改视图的基本属性(设置视图的宽高、间距和对齐方式)、运用各种布局排列控件(线性布局、相对布局、网格布局、滚动视图)、处理按钮的触控事件(按钮控件的点击、长按、禁用与恢复)、在图像控件上显示图片(图像视图、图像按钮、同时展示文本与图像)。最后设计了一个实战项目“简单计算器”,在该项目的App编码中用到了前面介绍的大部分控件和布局,从而加深了对所学知识的理解。

梁辰兴的博客 1万+

【2024/3/12 更新】Windows Server 2019 服务配置与管理汇总

本栏目一共介绍了17种Windows Server 2019 的服务配置与管理,为了方便大家阅读理解,特意总结了17种服务的一些内容。具体说明如下所示

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 2万+

【安卓】Android Studio简易计算器(实现加减乘除,整数小数运算,正数负数运算)

随着移动互联网的普及,手机应用程序已经成为人们生活中不可或缺的一部分。计算器是一类被广泛使用的应用程序之一,因此学习如何开发一款简易的计算器应用程序是学习Android Studio开发的一个很好的开始。Android Studio是一款Google开发的用于创建安卓应用的集成开发环境(IDE), 它可以帮助开发者快速设计、开发和测试应用程序。接下来我将为大家介绍如何使用Android Studio创建一个简易的计算器应用程序。

qq_73830179的博客 1万+

AI 辅助编程全景:演进、提效场景与未来趋势

本文系统梳理了AI辅助编程的发展历程与应用场景。演进路径分为三代:从代码补全工具(2023)、对话式助手(2024)到自主编程代理(2025)。在软件全生命周期中,AI可显著提升各环节效率:需求分析阶段节省30-60%文档编写时间;设计阶段缩短40-60%技术调研周期;编码阶段通过智能补全提升55%任务速度;测试阶段减少30-60%测试编写时间。数据显示,2025年84%开发者使用AI工具,41%代码由AI生成,平均每周节省3.6小时。AI正推动开发者角色从编写者转变为审核者,但复杂业务逻辑和架构设计仍需人

甘蓝的专栏 472

RK3568适配MIPI屏幕触摸,触摸延时很大

我用的是系统,接了一个,设备树已经正确配置,evtest测试坐标值和触摸位置都是准确的。但是出现了一个:我在屏幕上点一下,要等大约 2 秒才能在evtest里看到坐标事件打印。这种现象在 Goodix 系列触摸驱动里比较少见,一般意味着。

小灰灰的博客 1363

Android Studio 简单项目——简易计算器

Android Studio 简单项目——简易计算器 目录 Android Studio 简单项目——简易计算器 一、前言 二、设计界面 三、主要代码 四、完整资源 一、前言 软件:Android Studio 需求:学习Android Studio,做一个简易计算器深入学习 (附:刚开始学习,部分代码参考,在此基础上增删改) 主要功能实现: 1.简单计算器加减乘除 2....

Qi2456的博客 7967

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

android开发实例学习笔记之简易计算器的开发

开发工具:android studio目标:开发一个能够实现加减乘除的简易计算器1.打开Android studio ,新建一个项目(基本操作,直接上图)点击finish后就该开始我们的代码表演了2.在app-&gt;src-&gt;main-&gt;res-&gt;layout-&gt;activity_main布局文件中添加我们简易计算器中要用到的组件,包括两个TextView(分别用来显示输...

coderxsj 6235

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android_计算器练习

Y61901的博客 1820

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

安卓开发例程之计算器项目

安卓开发之计算器项目

qq_54122113的博客 732
上一篇: Android学习笔记(八):ImageView加载图片与ImageButton图形按钮
下一篇: Android学习笔记(十):双人联机扫雷小游戏
CJ_study92
博客等级 码龄5年 143粉丝 10原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值