1. 程式人生 > >Android實現簡單的計算器

Android實現簡單的計算器

android的佈局和配置檔案

1.下面就是android實現的計算器的佈局配置,可以看見基本是線性佈局,這樣的好處是介面簡潔明瞭

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
    
<!-- 任務:    要求datapick,監聽使用者選擇的日期 -->
    <!--         android:inputType="text" -->
    
        <EditText
        android:layout_width="280dp"
        android:layout_height="80dp"
        android:background="@android:drawable/edit_text"
        android:inputType="text"
        android:id="@+id/result" 
        
        	/> 
    
    <LinearLayout 
        android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:orientation="horizontal"
        >
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_ce"
            android:id="@+id/c_ce"
            />
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_c"
            android:id="@+id/c_c"
            />
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_xx"
            android:id="@+id/c_xx"
            />
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_div"
            android:id="@+id/c_div"
            />
    </LinearLayout>
    
    <LinearLayout 
        android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:orientation="horizontal"
        >
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_7"
            android:id="@+id/c_7"
            />
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_8"
            android:id="@+id/c_8"
            />
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_9"
            android:id="@+id/c_9"
            />
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_X"
            android:id="@+id/c_X"
            />
    </LinearLayout>
    
    <LinearLayout 
        android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:orientation="horizontal"
        >
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_4"
            android:id="@+id/c_4"
            />
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_5"
            android:id="@+id/c_5"
            />
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_6"
            android:id="@+id/c_6"
            />
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_delete"
            android:id="@+id/c_delete"
            />
    </LinearLayout>
    
    <LinearLayout 
        android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:orientation="horizontal"
        >
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_1"
            android:id="@+id/c_1"
            />
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_2"
            android:id="@+id/c_2"
            />
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_3"
            android:id="@+id/c_3"
            />
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_add"
            android:id="@+id/c_add"
            />
    </LinearLayout>
    
    <LinearLayout 
        android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:orientation="horizontal"
        >
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_aord"
            android:id="@+id/c_aord"
            />
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_0"
            android:id="@+id/c_0"
            />
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_point"
            android:id="@+id/c_point"
            />
        <Button 
            android:layout_width="70dp"
            android:layout_height="60dp"
            android:text="@string/c_equal"
            android:id="@+id/c_equal"
            />
    </LinearLayout>
    
    

    

</LinearLayout>

2.按鈕對應的字串配置:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">計算器</string>
    <string name="action_settings">Settings</string>
    <string name="c_ce">CE</string>
	<string name="c_c">C</string>
	<string name="c_xx">Xx</string>
	<string name="c_div">÷</string>
	
	<string name="c_7">7</string>
	<string name="c_8">8</string>
	<string name="c_9">9</string>
	<string name="c_X">X</string>
	
	<string name="c_4">4</string>
	<string name="c_5">5</string>
	<string name="c_6">6</string>
	<string name="c_delete">-</string>
	
	<string name="c_1">1</string>
	<string name="c_2">2</string>
	<string name="c_3">3</string>
	<string name="c_add">+</string>
	
	<string name="c_aord">±</string>
	<string name="c_0">0</string>
	<string name="c_point">·</string>
	<string name="c_equal">=</string>

</resources>

實現的介面效果如下



3.具體操作細節:

這裡由於是個練習沒有按照很嚴格的分類但功能基本實現了:

以下是邏輯需要用運算介面和加減乘除演算法:

package com.example.control;

public interface Calculate {
	/**
	 * 計算的方法
	 * @param x 輸入的要被計算的引數x
	 * @param y 輸入的要被計算的引數y
	 */
	public float calculate(double x,double y);
}

package com.example.control;

public class Add implements Calculate{


	@Override
	public float calculate(double x, double y) {
		return (float) (x+y);
	}
	
}

package com.example.control;

public class Delete implements Calculate{

	public float calculate(double x, double y) {
		return (float) (x-y);
	}

}

package com.example.control;

public class Mulitply implements Calculate{

	public float calculate(double x, double y) {
		return (float) (x*y);
	}

}

package com.example.control;

public class Div implements Calculate{

	public float calculate(double x, double y) {
		if(y==0){
			try {
				throw new Exception("被除數不能為0");
			} catch (Exception e) {
				e.printStackTrace();
			}
			return 0;
		}
		return (float) (x/y);
	}

}

以上這些供具體使用的時候呼叫

4.以下為activity和監聽的內容:

package com.example.caculate;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.example.control.Add;
import com.example.control.Calculate;
import com.example.control.Delete;
import com.example.control.Div;
import com.example.control.Mulitply;

public class MainActivity extends Activity {
	
	private float x,y;
	private String text="";
	private int tagremeber=0;
	private EditText textview;
	private boolean eqstatus=false;
	private boolean zestatus=false;
	private int count=0;
	
	private Calculate cl;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textview=(EditText) findViewById(R.id.result);
        textview.setText("0.0");
        textview.requestFocus();
        
        Button bt_0=(Button) findViewById(R.id.c_0);
        Button bt_1=(Button) findViewById(R.id.c_1);
        Button bt_2=(Button) findViewById(R.id.c_2);
        Button bt_3=(Button) findViewById(R.id.c_3);
        Button bt_4=(Button) findViewById(R.id.c_4);
        Button bt_5=(Button) findViewById(R.id.c_5);
        Button bt_6=(Button) findViewById(R.id.c_6);
        Button bt_7=(Button) findViewById(R.id.c_7);
        Button bt_8=(Button) findViewById(R.id.c_8);
        Button bt_9=(Button) findViewById(R.id.c_9);
        Button bt_add=(Button) findViewById(R.id.c_add);
        Button bt_delete=(Button) findViewById(R.id.c_delete);
        Button bt_mul=(Button) findViewById(R.id.c_X);
        Button bt_div=(Button) findViewById(R.id.c_div);
        Button bt_c=(Button) findViewById(R.id.c_c);
        Button bt_xx=(Button) findViewById(R.id.c_xx);
        Button bt_ce=(Button) findViewById(R.id.c_ce);
        Button bt_aord=(Button) findViewById(R.id.c_aord);
        Button bt_equal=(Button) findViewById(R.id.c_equal);
        Button bt_point=(Button) findViewById(R.id.c_point);
        
        //其中1-10為數字  11-20位運算子
        bt_0.setTag(20);
        bt_1.setTag(1);
        bt_2.setTag(2);
        bt_3.setTag(3);
        bt_4.setTag(4);
        bt_5.setTag(5);
        bt_6.setTag(6);
        bt_7.setTag(7);
        bt_8.setTag(8);
        bt_9.setTag(9);
        bt_add.setTag(10);
        bt_delete.setTag(11);
        bt_mul.setTag(12);
        bt_div.setTag(13);
        
        bt_c.setTag(14);
        bt_xx.setTag(15);
        bt_ce.setTag(16);
        bt_aord.setTag(17);
        bt_equal.setTag(18);
        bt_point.setTag(19);
        //給0-9和.加上數值對應的監聽
        bt_0.setOnClickListener(ol);
        bt_1.setOnClickListener(ol);
        bt_2.setOnClickListener(ol);
        bt_3.setOnClickListener(ol);
        bt_4.setOnClickListener(ol);
        bt_5.setOnClickListener(ol);
        bt_6.setOnClickListener(ol);
        bt_7.setOnClickListener(ol);
        bt_8.setOnClickListener(ol);
        bt_9.setOnClickListener(ol);
        bt_point.setOnClickListener(ol);
        //運算子類按鈕加上運演算法類的監聽
        bt_add.setOnClickListener(cal_listener);
        bt_delete.setOnClickListener(cal_listener);
        bt_mul.setOnClickListener(cal_listener);
        bt_div.setOnClickListener(cal_listener);
        bt_equal.setOnClickListener(cal_listener);
        //清除等按鈕
        bt_c.setOnClickListener(setzero_listener);
        bt_xx.setOnClickListener(setzero_listener);
        bt_ce.setOnClickListener(setzero_listener);
        bt_aord.setOnClickListener(setzero_listener);
    }
    
    OnClickListener ol=new OnClickListener() {
		public void onClick(View view) {
			int tag=(Integer) view.getTag();
			if(eqstatus){
				text="";
				textview.setSelection(text.length());
				eqstatus=false;
			}
			
			if(zestatus){
				text="";
				textview.setSelection(text.length());
				zestatus=false;
			}
			
			switch(tag){

			case 20:
				text=text+"0";
				break;
			case 1:
				text=text+"1";
				break;
			case 2:
				text=text+"2";
				break;
			case 3:
				text=text+"3";
				break;
			case 4:
				text=text+"4";
				break;
			case 5:
				text=text+"5";
				break;
			case 6:
				text=text+"6";
				break;
			case 7:
				text=text+"7";
				break;
			case 8:
				text=text+"8";
				break;
			case 9:
				text=text+"9";
				break;
			case 19:
				text=text+".";
			}
			textview.setText(text);
			textview.setSelection(text.length());
		}
	};
	
	OnClickListener cal_listener=new OnClickListener() {
		
		public void onClick(View view) {
			int tag=(Integer) view.getTag();
		//當單擊運算按鈕不為=時
		if(tag!=18){
			//儲存x並清除文字域
			x=Float.parseFloat(text);
			tagremeber=tag;
			text="";
			textview.setText(text);
			textview.setSelection(text.length());
		}
		//點選=運算子時
		else if(tag==18){
			
			
				y=Float.parseFloat(text);
				switch(tagremeber){
				case 10:
					cl=new Add();
					break;
				case 11:
					cl=new Delete();
					break;
				case 12:
					cl=new Mulitply();
					break;
				case 13:
					cl=new Div();
					break;
				}
				float result=cl.calculate(x, y);
				text=String.valueOf(result);
				textview.setText(text);
				textview.setSelection(text.length());
			
			//表示當前狀態為結果狀態,下次點選數字時會自動清除這次結果
			eqstatus=true;
		}
		
		}
	};
	
	
	OnClickListener setzero_listener=new OnClickListener() {
		//
		@Override
		public void onClick(View view) {
			int tag=(Integer) view.getTag();
			
			switch(tag){
			//全部清除
			case 14:
				x=0;
				y=0;
				text="0.0";
				zestatus=true;
				break;
			case 15:
				text=text.substring(0,text.length()-1);
				break;
			case 16:
				x=0;
				text="0.0";
				zestatus=true;
				break;
			case 17:
				count++;
				if(count!=0&&count%2==0){
					text=text.substring(1);
				}
				else if(count%2==1){
					text="-"+text;
				}
				break;
			}
				textview.setText(text);
				textview.setSelection(text.length());
				
		}
	};

	
    /**
     * 配置選單元件
     */
    public boolean onCreateOptionsMenu(Menu menu) {
    	menu.add(0, 0, 1,"退出" );
    	menu.add(0,1,2,"關於");
        return true;
    }

    /**
     * 觸發相應的事件
     */
    public boolean onOptionsItemSelected(MenuItem item) {
    	switch(item.getItemId())
    	{
    	case 0:
    		finish();
    	case 1:
    		Toast.makeText(MainActivity.this, "這是浩哥的計算機", 1).show();
    	}
    	return super.onOptionsItemSelected(item);
    }
}


以上的按鈕的功能包括刪除,正負和置零功能以及加減乘除基本都實現了,感興趣的朋友可以自己實際測試一下