【Android开发-4】进入实践,最喜欢折腾的计算器

前言:前面对项目文件有了感性认识,接下来我们就需要通过不断实践,对项目的文件有理性的认识。以前折腾Unity3d、IOS开发都是拿计算器开刀,所以这次Android开发实践也不例外,继续拿计算器折腾。通过本人总结,你通过折腾计算器,可以学习掌握到对文本、按钮、输入框控件的事件监听触发和一些控件读写操作,编程语言可以接触到字符串的分割、拼接、查找等方法使用,还有if-else,switch控制语句的使用;总之通过操作一款简单的计算器,可以基本熟悉该开发环境下的流程和编程语言的使用。

首先展示下折腾的效果:

进入折腾步骤

第一步:创建项目,创建完项目文件结构如下:

第二步:布局界面,找到项目文件中的layout->activity_main,里面的布局代码编写如下:

<RelativeLayout 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: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="com.wyz.calc.MainActivity" >

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="15dp"
        android:text="@string/mycalc" />

    <EditText
        android:id="@+id/displaynum"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@id/title"
        android:layout_marginBottom="15dp" />

    <LinearLayout
        android:id="@+id/row1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/displaynum"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btn_num_1"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_marginRight="20dp"
            android:layout_weight="1"
            android:text="1" />

        <Button
            android:id="@+id/btn_num_2"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_marginRight="20dp"
            android:layout_weight="1"
            android:text="2" />

        <Button
            android:id="@+id/btn_num_3"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_marginRight="20dp"
            android:layout_weight="1"
            android:text="3" />

        <Button
            android:id="@+id/btn_add"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:text="+" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/row2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/row1"
        android:layout_marginTop="20dp"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btn_num_4"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_marginRight="20dp"
            android:layout_weight="1"
            android:text="4" />

        <Button
            android:id="@+id/btn_num_5"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_marginRight="20dp"
            android:layout_weight="1"
            android:text="5" />

        <Button
            android:id="@+id/btn_num_6"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_marginRight="20dp"
            android:layout_weight="1"
            android:text="6" />

        <Button
            android:id="@+id/btn_sub"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:text="-" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/row3"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/row2"
        android:layout_marginTop="20dp"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btn_num_7"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_marginRight="20dp"
            android:layout_weight="1"
            android:text="7" />

        <Button
            android:id="@+id/btn_num_8"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_marginRight="20dp"
            android:layout_weight="1"
            android:text="8" />

        <Button
            android:id="@+id/btn_num_9"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_marginRight="20dp"
            android:layout_weight="1"
            android:text="9" />

        <Button
            android:id="@+id/btn_mul"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:text="*" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/row4"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/row3"
        android:layout_marginTop="20dp"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btn_num_0"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_marginRight="20dp"
            android:layout_weight="1"
            android:text="0" />

        <Button
            android:id="@+id/btn_douhao"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_marginRight="20dp"
            android:layout_weight="1"
            android:text="·" />

        <Button
            android:id="@+id/btn_equal"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_marginRight="20dp"
            android:layout_weight="1"
            android:text="=" />

        <Button
            android:id="@+id/btn_div"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:text="/" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/row5"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/row4"
        android:layout_marginTop="20dp"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btn_ce"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_marginRight="20dp"
            android:layout_weight="1"
            android:text="CE" />

        <Button
            android:id="@+id/btn_del"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:text="Del" />
    </LinearLayout>

</RelativeLayout>

注:主要用到五大布局中的相对布局RelativeLayout和线性布局LinearLayout,还有就是布局中它们带有的属性;布局文件我们也就先感性认识,慢慢实践,然后升到理性。

第三步:编写主代码,找到项目文件中的src下的MainActivity.java,里面的代码编写如下:

package com.wyz.calc;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
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;

public class MainActivity extends Activity {
	Button btn_num_1;
	Button btn_num_2;
	Button btn_num_3;
	Button btn_num_4;
	Button btn_num_5;
	Button btn_num_6;
	Button btn_num_7;
	Button btn_num_8;
	Button btn_num_9;
	Button btn_num_0;
	Button btn_douhao;
	Button btn_equal;
	Button btn_add;
	Button btn_sub;
	Button btn_mul;
	Button btn_div;
	Button btn_ce;
	Button btn_del;

	EditText displayText; 

	int ioperator=0;	//操作符标志1代表+,2代表-,3代表*,4代表/
	double result=0;	//计算结果
	double num1=0;		//第一个操作数
	double num2=0;		//第二个操作数

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

		//根据R中记录的控件id找到界面的控制对象
		btn_num_1 = (Button)findViewById(R.id.btn_num_1);
		btn_num_2 = (Button)findViewById(R.id.btn_num_2);
		btn_num_3 = (Button)findViewById(R.id.btn_num_3);
		btn_num_4 = (Button)findViewById(R.id.btn_num_4);
		btn_num_5 = (Button)findViewById(R.id.btn_num_5);
		btn_num_6 = (Button)findViewById(R.id.btn_num_6);
		btn_num_7 = (Button)findViewById(R.id.btn_num_7);
		btn_num_8 = (Button)findViewById(R.id.btn_num_8);
		btn_num_9 = (Button)findViewById(R.id.btn_num_9);
		btn_num_0 = (Button)findViewById(R.id.btn_num_0);

		btn_douhao = (Button)findViewById(R.id.btn_douhao);
		btn_equal = (Button)findViewById(R.id.btn_equal);
		btn_add = (Button)findViewById(R.id.btn_add);
		btn_sub = (Button)findViewById(R.id.btn_sub);
		btn_mul = (Button)findViewById(R.id.btn_mul);
		btn_div = (Button)findViewById(R.id.btn_div);
		btn_ce = (Button)findViewById(R.id.btn_ce);
		btn_del = (Button)findViewById(R.id.btn_del);

		displayText = (EditText)findViewById(R.id.displaynum);

		BtnListener btnListener = new BtnListener(); //创建事件监听器

		btn_num_1.setOnClickListener(btnListener);   //绑定监听器
		btn_num_2.setOnClickListener(btnListener);
		btn_num_3.setOnClickListener(btnListener);
		btn_num_4.setOnClickListener(btnListener);
		btn_num_5.setOnClickListener(btnListener);
		btn_num_6.setOnClickListener(btnListener);
		btn_num_7.setOnClickListener(btnListener);
		btn_num_8.setOnClickListener(btnListener);
		btn_num_9.setOnClickListener(btnListener);
		btn_num_0.setOnClickListener(btnListener);
		btn_douhao.setOnClickListener(btnListener);
		btn_equal.setOnClickListener(btnListener);
		btn_add.setOnClickListener(btnListener);
		btn_sub.setOnClickListener(btnListener);
		btn_mul.setOnClickListener(btnListener);
		btn_div.setOnClickListener(btnListener);
		btn_ce.setOnClickListener(btnListener);
		btn_del.setOnClickListener(btnListener);

	}

	//自己创建个按钮监听器类,实现接口OnClickListener,实现接口onclick方法
	class BtnListener implements OnClickListener
	{

		@Override
		public void onClick(View v) {
			CharSequence nowText = displayText.getText(); //每次按下时,先获取显示的文本内容
			String myString=nowText.toString();  	//转化成字符串

			switch(v.getId())
			{

			case R.id.btn_num_1:
				myString+="1";
				num1=Double.parseDouble(myString);

				break;
			case R.id.btn_num_2:
				myString+="2";
				num1=Double.parseDouble(myString);
				break;
			case R.id.btn_num_3:
				myString+="3";
				num1=Double.parseDouble(myString);
				break;
			case R.id.btn_num_4:
				myString+="4";
				num1=Double.parseDouble(myString);
				break;
			case R.id.btn_num_5:
				myString+="5";
				num1=Double.parseDouble(myString);
				break;
			case R.id.btn_num_6:
				myString+="6";
				num1=Double.parseDouble(myString);
				break;
			case R.id.btn_num_7:
				myString+="7";
				num1=Double.parseDouble(myString);
				break;
			case R.id.btn_num_8:
				myString+="8";
				num1=Double.parseDouble(myString);
				break;
			case R.id.btn_num_9:
				myString+="9";
				num1=Double.parseDouble(myString);
				break;
			case R.id.btn_num_0:
				myString+="0";
				num1=Double.parseDouble(myString);
				break;
			case R.id.btn_douhao:
				if(!myString.contains("."))  //如果已经有.,就不加了
				{
					myString+=".";
				}

				break;

			case R.id.btn_add:
				ioperator = 1;
				num2=Double.parseDouble(myString);
				myString="";
				break;
			case R.id.btn_sub:
				ioperator = 2;
				num2=Double.parseDouble(myString);
				myString="";
				break;
			case R.id.btn_mul:
				ioperator = 3;
				num2=Double.parseDouble(myString);
				myString="";
				break;
			case R.id.btn_div:
				ioperator = 4;
				num2=Double.parseDouble(myString);
				myString="";
				break;

			case R.id.btn_equal:
				if(myString.isEmpty())	//如果获得字符串为空,不操作
				{
					break;
				}
				num1=Double.parseDouble(myString); 

				if(ioperator == 1)
				{
					result = num1 + num2;
				}
				else if(ioperator == 2)
				{
					result = num2-num1 ;
				}
				else if(ioperator == 3)
				{
					result = num1*num2;
				}
				else if(ioperator == 4)
				{
					result = num2/num1;
				}
				num2=result;
				num1=0;
				long tmp=0;
				if(result%1.0 == 0)		//去掉整数后面的小数点
				{
					tmp=(long)result;
					myString = String.valueOf(tmp);
				}
				else
				{
					myString = String.valueOf(result);
				}

				break;
			case R.id.btn_ce:
				num1=0;
				num2=0;
				result=0;
				ioperator=0;
				myString="";
				break;
			case R.id.btn_del:

				if(myString.length() != 0)	//不为空才可以删
				{
					myString=myString.substring(0, myString.length()-1);

				}

				break;
			default:
				break;
			}
			//调试信息
			Log.d("debugnum1", String.valueOf(num1));
			Log.d("debugnum2", String.valueOf(num2));
			Log.d("myString", myString);
			displayText.setText(myString);
		}
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}

主要思路是:

1.声明界面上面的控制变量和要用到的变量

2.通过findViewById找到布局文件中的控件对象,并把对象赋给声明对应的变量

3.写个类监听器,实现按钮监听器接口,当控件被点击时触发

4.控件变量,绑定监听器

5.开始在类监听器中,写触发事件业务处理的逻辑

第四步:到此基本完成,剩下的就是调试找bug

注:本人调试主要通过Log.d()把信息打印到输出日志控制台LogCat

【Android开发-4】进入实践,最喜欢折腾的计算器,布布扣,bubuko.com

时间: 2024-12-19 03:42:47

【Android开发-4】进入实践,最喜欢折腾的计算器的相关文章

Android开发和测试实践 - 接入友盟统计

这两年一直在做无线的测试,后续还会继续去做无线的测试,但是之前因为时间的原因一直都没有非常仔细的了解到代码层面.近期抽空自己做了些app的开发,决定如果想把移动的测试做好做深入,有一定的app开发经验非常的有必要,因为只有这样很多东西才能真正理解了.另一个方面,这本身也很有趣.目前尝试的一些东西都还比较基础,准备持续的做下去. 实践的过程也想陆续整理出来,做下笔记,也给别人一些参考,遇到很多问题的时候也是到谷歌度娘的找答案,帮助很多.目前更多关注android,ios的部分稍继续. 基本上现在任

Android开发MVP模式实践

现在用一个基于MVP模式的APP项目进一步分析MVP的实际应用. 原项目应该使用的是Android studio开发,笔者对项目进行了整理,广大Eclipser请猛点Github链接. 一.项目功能说明 APP获取好友列表后将数据展示在一个ListView中,点击Item会打开一个新页面展示好友详细信息. 二.项目结构 示例将代码分为四层,对应到MVP模式中: Mode:Entities Presenter:Use Cases+Presenters View:UI 为了保证每个层都能方便的进行单

Android开发实践:Android交叉编译工具链的使用

前面2篇文章分别介绍了Android NDK编译的命令行参数,以及如何在任意目录使用Android.mk来编译本地c/c++代码,Andriod.mk和ndk-build只不过是Android官方提供了一套封装过的Android交叉编译环境而已,其实,你可以不用它,而直接通过传统的Makefile文件来编译你的c/c++代码的,本文即介绍如何直接通过传统的Makefile文件来编译可用于Android平台的库文件. 经常搞嵌入式开发的朋友对于交叉编译环境应该并不陌生,说白了,就是一组运行在x86

Android开发实践:利用ProGuard进行代码混淆

由于Android的代码大都是Java代码,所以挺容易被反编译的,好在Android ADT为我们集成了混淆代码的工具,一来可以混淆我们的代码,让程序被反编译后基本看不懂,另外还能起到代码优化的作用.发布项目前,建议打开Android的代码混淆功能. Android ADT主要通过ProGuard工具来提供代码混淆,网上也有挺多博客文章讲这个的,但感觉很多都介绍得太过于复杂,这里我就以问答的方式来更加简洁地介绍下ProGuard吧. 1. ProGuard是什么 ProGuard是一个工具,用来

Android开发实践:WIFI连接功能的封装

在上一篇文章<Android开发实践:WIFI扫描功能的封装>介绍了如何利用Andriod的API实现WIFI的扫描,本文则重点讲述一下如何连接WIFI吧,在此,也给出一个封装WIFI连接过程的类,提供简单的接口以供在各个代码工程中复用. 与WIFI扫描类似,WIFI的连接同样是一个耗时的过程,所以需要放到线程中执行,通过回调来通知调用者连接结果.该回调接口的定义如下: public interface WifiConnectListener { public void OnWifiConne

Android开发实践:由new Handler()说开去

最近面试一些Android开发的应聘者,除了基本的Activity生命周期等基础问题以外,我一般还会问如下两个问题: (1) Service与Thread有什么区别? (2) 在Activity里new Handler()和在自己创建的Thread中new Handler()有什么区别? 第一个问题其实是一个伪命令,因为Service是Android四大组件之一,而Thread只是Java提供的一个封装了线程管理的工具类,无论是Activity还是Service,都可以通过Thread来创建一个

Android开发实践:为什么要继承onMeasure()

Android开发中偶尔会用到自定义View,一般情况下,自定义View都需要继承View类的onMeasure方法,那么,为什么要继承onMeasure()函数呢?什么情况下要继承onMeasure()?系统默认的onMeasure()函数行为是怎样的 ?本文就探究探究这些问题. 首先,我们写一个自定义View,直接调用系统默认的onMeasure函数,看看会是怎样的现象: package com.titcktick.customview; import android.content.Con

Android开发实践:Java层与Jni层的数组传递

Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni层也需要把从Socket接收到的数据流返回给Java层.我简单地总结了一下,从Java层到Jni层,从Jni层到JAVA层,各有3种传递方式,下面用代码示例简单地介绍一下. 示例代码的主要文件有两个,一个是Native.java,是Java层的类:另一个是Native.c,是JNI层的文件,关键的地

Android开发实践:以“专业”的态度处理多线程

刚开始学一门编程语言的时候,我总是会有一种困惑,怎样让自己的代码看起来更"专业"?很多时候,我们可以照着教材实现一些基本的功能,比如用Socket发送/接收几个字符,写一个线程完成某个异步任务,但是在实际的项目中,往往不那么简单,比如需要设计Socket通信协议,需要处理Socket的连接异常断开,需要考虑在线程阻塞的情况下如何正常退出和释放资源等等,关于这些"实战经验",前面的文章也有所涉及,以后有空准备再开个专题跟大家分享探讨一下,今天先简单地说说怎样更&quo