●實作練習:預期畫面
●程式說明:
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中的checkbox的onclick也必須移除,不然會找不到出現閃退問題
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):計算商品價格並加入免費小菜加點
文章標籤
全站熱搜