1. 程式人生 > >從簡易計算器學習Android開發

從簡易計算器學習Android開發

初學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