●實作練習:預期畫面 

Screenshot_2019-04-26-10-20-45.png     Button and StringBuilder     Button and StringBuilder

●程式說明:

1. checkbox繼承button所以會有onclick,也繼承textview,所以也會有textallcaps屬性,去查check box api

2. 用String builder來處理大量的字串顯示

=>字串就是字元的陣列

=>因為如果使用String會有個問題,String物件是不能改變的,當使用String每加一次字串,就會產生一個新的 String物件,這樣會越來越多垃圾,
舉例說明:String x="a"+"b"+"c"
=>"a"+"b"時會先產生一個新的String物件,用這個新的String物件再去加"c",又產生一個新的 String物件 ,這過程中多出來又用不到的 String物件就會變成垃圾,佔據記憶體空間
=>在java中如果String用+的,其實在程式內部就會自己用StringBuilder來做,但要記得做完以後要更新要先清空上一個舊的
 
3.StringBuilder method:
StringBuilder.delete(起始索引,結束索引):刪除字串時不包括結束索引的字串,delete(0,3)意思是刪除0~2之間的字
StringBuilder.append(新字串):將新字串加到原有字串的後面
 

4.可以自己寫測試程式,用android monitor來測試checkbox是否有正常運作

 

●實作練習:xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
    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"
    tools:context="com.example.student.lab0301.MainActivity">
    <!--toppings-->
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        tools:ignore="MissingConstraints"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="0dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="16dp"
            android:text="Toppings"
            android:textSize="25sp"
            tools:ignore="HardcodedText" />

        <!--共用一個onClick method=>myClick-->
        <CheckBox
            android:id="@+id/veg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="16dp"
            android:onClick="myClick"
            android:text="泡菜"
            android:textSize="25sp" />
        />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingBottom="16dp"
            android:text="Quantity"
            android:textSize="25sp"
            tools:ignore="HardcodedText" />

        <!--quanity-->
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <Button
                android:id="@+id/add"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="16dp"
                android:layout_marginRight="16dp"
                android:onClick="myClick"
                android:text="+"
                android:textSize="25sp"
                tools:ignore="HardcodedText,RtlHardcoded" />

            <TextView
                android:id="@+id/quantity"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="16dp"
                android:text="0"
                android:textColor="@android:color/black"
                android:textSize="25sp"
                tools:ignore="HardcodedText" />

            <Button
                android:id="@+id/subtract"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="16dp"
                android:layout_marginLeft="16dp"
                android:onClick="myClick"
                android:text="-"
                android:textSize="25sp"
                tools:ignore="HardcodedText,RtlHardcoded" />
        </LinearLayout>

        <!--price-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="price"
            android:textAllCaps="true"
            android:textSize="25sp"
            tools:ignore="HardcodedText" />

        <TextView
            android:id="@+id/price"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/holo_orange_light"
            android:text=""
            android:textColor="@android:color/black"
            android:textSize="25sp" />

        <Button
            android:id="@+id/send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="myClick"
            android:text="ok"
            android:textSize="25sp"
            tools:ignore="HardcodedText" />
    </LinearLayout>
</android.support.constraint.ConstraintLayout>

 

●實作練習:Java Code

package com.example.student.lab0301;

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

import java.text.NumberFormat;

public class MainActivity extends AppCompatActivity {
    TextView quantity;
    TextView price;
    CheckBox veg;

    //一般命名變數時,前面加個m代表整個類別可以使用的變數,設定初始值
    private int mQuantity=0;
    private int mPrice=50;
    //可給初始容量,如果超過會自動擴大,如果不給會用預設,大約16個字元
    private StringBuilder msg=new StringBuilder(100);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        quantity=(TextView)findViewById(R.id.quantity);
        price=(TextView)findViewById(R.id.price);
        veg=(CheckBox)findViewById(R.id.veg);
    }

    //送出
    public void send(View v){
        displaytotalPirce();
    }

    //顯示數量
    public void displayquantity(){
        String ntoString=String.valueOf(mQuantity);
        quantity.setText(ntoString);
    }

    //加數量
    public void add(View v){
        mQuantity++;
        displayquantity();
        price.setText("");
    }

    //減數量
    public void subtract(View v){
        if(mQuantity>0){
            mQuantity--;
            displayquantity();
        }
        price.setText("");

    }

    //計算總價
    public void displaytotalPirce(){
        int totalP=mQuantity*mPrice;

        //因為字串是字元的陣列,所以可以用.length()取得字串長度
        int len=msg.length();

        //如果沒有把原本的字串刪除,會連上一次顯示的字串一起出現
        msg.delete(0,len);

        //貨幣格式化=>可以出現$符號
        String pay= NumberFormat.getCurrencyInstance().format(totalP);

        if(mQuantity==0){
            if(veg.isChecked()) {
                msg.append("客戶:鳴人\n商品:臭豆腐\n是否要加泡菜?\n免費試吃");
            }else{
                msg.append("客戶:鳴人\n商品:臭豆腐\n是否要加泡菜?\n免費試吃");
            }
        }else{
            if(veg.isChecked()){
                msg.append("客戶:鳴人\n商品:臭豆腐\n是否要加泡菜?\n")
                        .append("數量:").append(mQuantity)
                        .append("\n總額:").append(pay)
                        .append("\n謝謝!");
            }else{
                msg.append("客戶:鳴人\n商品:臭豆腐\n是否要加泡菜?\n")
                        .append("數量:").append(mQuantity)
                        .append("\n總額:").append(pay)
                        .append("\n謝謝!");
            }
        }

        price.setText(msg);
    }
        //如果要把測試程式關閉,xml中的checkboxonclick也必須移除,不然會找不到出現閃退問題
        public void chk(View v){
            if(veg.isChecked()){
                System.out.println("yes");
            }else{
                System.out.println("no");
            }
        }

        //統一管理所有button
        public void myClick(View v){
            //因為每個button(veiw)元件都共用一個myClick()方法,所以要先取得要用的v(這邊是指正在使用的那個button)id
            //因為id是放在R檔中,裡面都是int
            int id=v.getId();
            switch(id){
                case R.id.veg:
                    chk(v);
                    break;
                case R.id.add:
                    add(v);
                    break;
                case R.id.subtract:
                    subtract(v);
                    break;
                case R.id.send:
                    send(v);
                    break;
            }
        }
}

 

*程式參考(gitHub):計算商品價格並加入免費小菜加點

arrow
arrow

    muchone 發表在 痞客邦 留言(0) 人氣()