从简易计算器学习Android开发

版权声明:有问题请联系邮箱 [email protected] https://blog.csdn.net/qq_38066103/article/details/84641332

初学Android移动开发,先从一个简单的项目开始——简易计算器。

前言:

如果你在Android studio配置方面有什么错误,可以参考我的其他博客。这里只是写一下我作为一个初学者的开发笔记,总结自己的得失,为以后的开发打基础。对你有帮助的地方请自取。

目录

前言:

开发过程中的笔记:

代码目录结构:

源代码:


开发过程中的笔记:

  • 关于.xml
  1. 在开发一个项目的时候,首先要设计好  *.xml 界面的布局显示:*.xml界面总体布局结构使用到的有TableLayout(表格布局)、LinearLayout(线性布局)——分为垂直线性布局(android:orientation="vertical")和水平线性布局 (android:orientation="horizontal")。
  2. 在TableLayout(表格布局)中,如果一行有多个控件,使用<TableRow>,把要放在一行的控件放在一个<TableRow>之中,可以自动实现对齐等效果。
  3. <TextView>标签一般用于显示的控件,不对其进行操作,运行之后也无法标签里边的更改内容。而<EditText>则是允许输入的输入框,接收字符串和整型数字等,在新版的Android studio中控件<EditText>不会自动适应长度,需要通过android:ems="10" 来改变长度。PS:有些控件在可拖拽的Palette的控件列表中无法找到,但可以使用。
  4. 需要获取数据的控件,或者需要通过代码来控制显示信息的控件,需要给控件自定义id,android:id="@+id/StringName",在*Activity.java 的类中,定义变量,并在onCreate()中通过findViewById()方法来调用,例如
    private EditText firstText;
    private  EditText secondText;
    private TextView calculateTypeText;


 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        firstText = (EditText) this.findViewById(R.id.firstNumber);
        secondText = (EditText)this.findViewById(R.id.secondNumber);
        calculateTypeText = (TextView) this.findViewById(R.id.calculateTypeText);
    }
  •  关于*Activity.java
  1. 需要导入引用的的import ,会在创建变量的时候自动添加引用。
  2. 需要的操作*.xml的变量,都要去定义,定义分为私有private、公有public、保护protected三种,按照需求自行定义。对于定义变量的赋值,即找到变得所对应的id,需要在onCreate()中通过方法实现。如上☝
  3. 每一种操作都要有一个方法监听,比如点击事件,单选框改变事件等。新建一个事件之后要对这个事件的函数复写,即事件的具体操作和执行。
  4. Intent 是一个用于各个界面之间数据交换和传递的类,Bundle也是一个用于个界面数据交换和传递的类。不同点举个栗子:现在我要把值通过A经过B传给C。如果用Intent的话 A到B先写一遍, 再在B中都取出来 ,然后再把值放到Intent中 ,再跳到C,C才能收到数据。如果我在A中用了 Bundle 的话 ,我把Bundle传给B ,在B中再转传到C,  C就可以直接获取到值。这样的话 还有一个好处: 就是在B中 还可以给Bundle对象添加新的 key - value ,同样可以在C中取出来。

代码目录结构:

对于伸手党,最难过的莫过于只有代码,没有一个具体的大纲一样的目录结构。所以,习惯伸手的我,给习惯伸手的你一个便利。

源代码:

MainActivity.java:

package com.felix.felix.pro_calculator;

import android.content.Intent;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import org.w3c.dom.Text;

public class MainActivity extends AppCompatActivity {

    private EditText firstText;
    private  EditText secondText;
    private TextView calculateTypeText;

    private int firstNumber = 0;
    private int secondNumber =0;

    private Button chooseButton;
    private Button calculateButton;

    private  int requestCode= 0;
    private  int calculationType= -1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        firstText = (EditText) this.findViewById(R.id.firstNumber);
        secondText = (EditText)this.findViewById(R.id.secondNumber);
        calculateTypeText = (TextView) this.findViewById(R.id.calculateTypeText);

        chooseButton =(Button)this.findViewById(R.id.chooseButton);
        calculateButton=(Button)this.findViewById(R.id.calculateButton);

        //定义一个点击事件,点击跳转界面
        chooseButton.setOnClickListener(new ChooseButtonListener());
        calculateButton.setOnClickListener(new CalculateButtonListener());
    }

    //对于点击事件的类和函数复写
    class ChooseButtonListener implements View.OnClickListener{
        @Override
        public void onClick(View arg0) {
            //跳转界面的具体实现
            Intent intent = new Intent(MainActivity.this,CalculationTypeActivity.class);
            //带着其它界面的信息返回本界面。requestCode 是本界面的标识
            MainActivity.this.startActivityForResult(intent,requestCode);

        }
    }

    class CalculateButtonListener implements View.OnClickListener{
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this,ResultActivity.class);
            intent.putExtra("firstNumber",firstText.getText().toString());
            intent.putExtra("secondNumber",secondText.getText().toString());
            //计算结果
            intent.putExtra("calculationType",calculationType);

            int result =0;
            firstNumber = Integer.parseInt(firstText.getText().toString());
            secondNumber = Integer.parseInt(secondText.getText().toString());
            switch (calculationType){
                case 1:
                    result = firstNumber + secondNumber;
                    break;
                case 2:
                    result = firstNumber - secondNumber;
                    break;
                case 3:
                    result = firstNumber * secondNumber;
                    break;
                case 4:
                    result = firstNumber / secondNumber;
                    break;
                default:
                    result = 1;
                    break;
            }
            //带着这个界面的信息去其他界面
            intent.putExtra("result",result);
            startActivity(intent);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(this.requestCode==requestCode&& CalculationTypeActivity.resultCode==resultCode){
            Bundle bundle = data.getExtras();
            calculationType = data.getIntExtra("type1",-1);
            System.out.println("calculationType:" + calculationType);
            calculateTypeText.setText(ConstantInfo.typeMap.get(calculationType));
        }
    }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <TableRow>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="5dp"
            android:textSize="14sp"
            android:text="简易计算器"
            />
    </TableRow>

    <TableRow>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:text="第一个数:"
            android:textSize="18dp" />

        <EditText
            android:id="@+id/firstNumber"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:ems="10"
            android:hint="请输入第一个数"
            android:inputType="number"
            android:textSize="14sp" />

    </TableRow>

    <TableRow>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:textSize="18dp"
            android:text="第二个数:"
            />

        <EditText
            android:id="@+id/secondNumber"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:ems="10"
            android:hint="请输入第二个数"
            android:inputType="number"
            android:textSize="14sp" />

    </TableRow>

    <TableRow>
        <TextView
            android:id="@+id/calculateType"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:textSize="18dp"
            android:text="计算类型:"
            />

        <TextView
            android:id="@+id/calculateTypeText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:textSize="18dp"
            android:text="未选择计算类型"
            />

        <Button
            android:id = "@+id/chooseButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="-20dp"
            android:text="选择"
            />

    </TableRow>

    <TableRow>
        <Button
            android:id = "@+id/calculateButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:text="计算"
            />
    </TableRow>

</TableLayout>

CalculationTypeActivity.java

package com.felix.felix.pro_calculator;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;

public class CalculationTypeActivity extends AppCompatActivity {

    private RadioGroup group;
    private RadioButton add;
    private RadioButton minus;
    private RadioButton multiply;
    private RadioButton divider;

    private Button okBtn;

    private int calculationType = -1;
    protected static final int resultCode = 0x321;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_calculation_type);

        group = (RadioGroup)this.findViewById(R.id.group);

        add = (RadioButton)this.findViewById(R.id.add);
        minus = (RadioButton)this.findViewById(R.id.minus);
        multiply = (RadioButton)this.findViewById(R.id.multiply);
        divider = (RadioButton)this.findViewById(R.id.divider);

        okBtn = (Button)this.findViewById(R.id.ok);


        group.setOnCheckedChangeListener(new GroupSelectionListener());
        okBtn.setOnClickListener(new okLstener());

    }
    class GroupSelectionListener implements RadioGroup.OnCheckedChangeListener{

        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            //选择的是哪一个按钮
            int radioButtonId =  group.getCheckedRadioButtonId();
            RadioButton btn = (RadioButton)CalculationTypeActivity.this.findViewById(radioButtonId);

            //为啥不用switch?
            if(btn.getId()==add.getId()){
                calculationType=1;
            }else if(btn.getId()==minus.getId()){
                calculationType=2;
            }else if(btn.getId()==multiply.getId()){
                calculationType=3;
            }else if(btn.getId()==divider.getId()){
                calculationType=4;
            }
            System.out.println("current value:" + calculationType);
        }
    }
    //处理点击时间按钮,并且把信息返回到MainActivity中
    class okLstener implements View.OnClickListener{
        @Override
        public void onClick(View v) {
            Intent intent = getIntent();
            intent.putExtra("type1",calculationType);

            Bundle bundle = new Bundle();
            bundle.putInt("type",calculationType);
            intent.putExtras(bundle);

            //把这个activity的值回传回去
            CalculationTypeActivity.this.setResult(resultCode,intent);
            //把这个界面消掉,让MainActivity出现
            CalculationTypeActivity.this.finish();
        }

    }
}

activity_calculation_type.xml

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:text="请选择计算类型:"
        android:textSize="20dp" />

    <RadioGroup
        android:id="@+id/group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:orientation="vertical"
        >
        <RadioButton
            android:id="@+id/add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="加法"
            android:textSize="20dp"
            />
        <RadioButton
            android:id="@+id/minus"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="减法"
            android:textSize="20dp"
            />
        <RadioButton
            android:id="@+id/multiply"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="乘法"
            android:textSize="20dp"
            />
        <RadioButton
            android:id="@+id/divider"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="除法"
            android:textSize="20dp"
            />

        <Button
            android:id="@+id/ok"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:text="确定"
            />

    </RadioGroup>

</LinearLayout>

ResultActivity.java

package com.felix.felix.pro_calculator;

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

public class ResultActivity extends AppCompatActivity {

    private TextView resultText;
    private Button back;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);

        resultText = (TextView)this.findViewById(R.id.resultText);
        back = (Button)this.findViewById(R.id.back);

        back.setOnClickListener(new BackListener());

        Intent intent = this.getIntent();

        StringBuilder builder = new StringBuilder();
        builder.append(intent.getStringExtra("firstNumber"))
                .append(" ")
                .append(ConstantInfo.infoMap.get(intent.getIntExtra("calculationType",0)))
                .append(" ")
                .append(intent.getStringExtra("secondNumber"))
                .append(" = ")
                .append(intent.getIntExtra("result",-1));
        //把结果存入resultText中
        resultText.setText(builder.toString());

    }
    class BackListener implements View.OnClickListener{
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(ResultActivity.this,MainActivity.class);
            startActivity(intent);
            ResultActivity.this.finish();
        }
    }
}

activity_result.xml

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:text="计算结果"
        android:textSize="20dp"
        />

    <TextView
        android:id="@+id/resultText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="40dp"
        android:textSize="20dp"
        />
    <Button
        android:id="@+id/back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:text="返回"/>

</LinearLayout>

ConstantInfo.java

package com.felix.felix.pro_calculator;

import java.util.HashMap;
import java.util.Map;

/*
    Created by Felix on 2018/11/28 21:01

*/
public class ConstantInfo {

    public static final String add = "加法";
    public static final String minus = "减法";
    public static final String multiply = "乘法";
    public static final String divider = "除法";

    public static final Map<Integer,String> typeMap = new HashMap<Integer,String>();
    public static final Map<Integer,String> infoMap = new HashMap<Integer,String>();

    static {
        typeMap.put(1,add);
        typeMap.put(2,minus);
        typeMap.put(3,multiply);
        typeMap.put(4,divider);

        infoMap.put(1,"+");
        infoMap.put(2,"-");
        infoMap.put(3,"*");
        infoMap.put(4,"/");
    }
}

转载注明出处。

指教请联系:邮箱 [email protected]   QQ:1311665691

猜你喜欢

转载自blog.csdn.net/qq_38066103/article/details/84641332