实例2 最常用的线性布局
在本小节中,通过LinearLayout线性布局的应用,构建了一个小型的计算器界面。该计算器实现了整数间的加减乘除四则运算,并通过本计算器的实现,向读者介绍LinearLayout线性布局的具体应用。
【实例描述】
在本小节中实现了小型计算器软件的开发。该计算器通过0~9这10个数字按钮,“加”、“减”、“乘”、“除”和“等于”5个运算按钮,以及清空按钮来实现对本程序的操控,并通过一个文本框来显示计算的结果。应用本程序可以进行整数间简单的加、减、乘、除四则运算。
本实例的运行效果图,如图2-2所示。
图2-2 小型计算器
提示:使用者可以通过单击数字输入第一个计算值,然后单击所需计算按钮确定计算方式,再通过单击数字输入第二个计算值,之后当再次单击“等于”按钮时,软件会自动计算出结果数值,如图2-2所示。
【实现过程】
小型计算器的开发,主要运用了LinearLayout线性布局的相关知识。线性布局是最简单的布局之一,其提供了控件水平或者垂直排列的模型。同时,使用此布局时可以通过设置控件的weight参数控制各个控件在容器中的相对大小。
提示:线性布局垂直时占用一列,水平时占用一行。特别要注意的是,水平时若超过一行则不会像SE中的FlowLayout一样自动转行。
线性布局中可以使用gravity属性设置控件的对齐方式,详情如表2.1所列。
表2.1 线性布局gravity属性表
提示:当需要使用多个属性时,用“|”分隔开即可。
【代码解析】
首先为读者介绍的是小型计算器的主界面mian.xml的开发,代码如下。
代码位置:见随书光盘中源代码/第2章/Sample2_2/ res/layout目录下的main.xml。
1 <?xml version="1.0" encoding="utf-8"?> <!--版本号和编码方式--> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" android:layout_width="fill_parent" 4 android:layout_height="fill_parent" android:paddingTop="5dip"> 5 <TextView 6 android:id="@+id/tv" android:layout_width="fill_parent" 7 android:layout_height="40dip" android:layout_marginRight="5dip" 8 android:layout_marginLeft="5dip" android:background="#FFFFFF" 9 android:gravity="center_vertical|right" android:textSize="30dip" 10 android:textColor="#ff0000"> <!--设置颜色--> 11 </TextView> 12 <LinearLayout 13 android:orientation="horizontal" android:layout_width="fill_parent" 14 android:layout_height="wrap_content" android:paddingTop="5dip"> <!--距上面的距离--> 15 <Button 16 android:text="7" android:id="@+id/Button07" 17 android:layout_width="80dip"android:layout_height="wrap_content"/> 18 <Button 19 android:text="8" android:id="@+id/Button08" 20 android:layout_width="80dip"android:layout_height="wrap_content"/> 21 <Button 22 android:text="9" android:id="@+id/Button09" 23 android:layout_width="80dip"android:layout_height="wrap_content"/> 24 <Button 25 android:text="+" android:id="@+id/ButtonJia" 26 android:layout_width="80dip"android:layout_height="wrap_content"/> 27 </LinearLayout> 28 <LinearLayout 29 android:orientation="horizontal" android:layout_width="fill_parent" 30 android:layout_height="wrap_content" android:paddingTop="5dip"> 31 <Button 32 android:text="4" android:id="@+id/Button04" 33 android:layout_width="80dip"android:layout_height="wrap_content"/> 34 <Button 35 android:text="5" android:id="@+id/Button05" 36 android:layout_width="80dip"android:layout_height="wrap_content"/> 37 <Button 38 android:text="6" android:id="@+id/Button06" 39 android:layout_width="80dip"android:layout_height="wrap_content"/> 40 <Button 41 android:text="-" android:id="@+id/ButtonJian" 42 android:layout_width="80dip"android:layout_height="wrap_content"/> 43 </LinearLayout> <!--LinearLayout布局--> 44 <LinearLayout 45 android:orientation="horizontal" android:layout_width="fill_parent" 46 android:layout_height="wrap_content" android:paddingTop="5dip"> 47 <Button 48 android:text="1" android:id="@+id/Button01" 49 android:layout_width="80dip"android:layout_height="wrap_content"/> 50 <Button 51 android:text="2" android:id="@+id/Button02" android:layout_width="80dip" 52 android:layout_height="wrap_content"/> 53 <Button 54 android:text="3" android:id="@+id/Button03" 55 android:layout_width="80dip"android:layout_height="wrap_content"/> 56 <Button 57 android:text="*" android:id="@+id/ButtonCheng" 58 android:layout_width="80dip"android:layout_height="wrap_content"/> 59 </LinearLayout> <!--LinearLayout布局--> 60 <LinearLayout 61 android:orientation="horizontal" android:layout_width="fill_parent" 62 android:layout_height="wrap_content" android:paddingTop="5dip"> 63 <Button 64 android:text="0" android:id="@+id/Button00" 65 android:layout_width="80dip"android:layout_height="wrap_content"/> 66 <Button 67 android:text="c" android:id="@+id/ButtonC" 68 android:layout_width="80dip"android:layout_height="wrap_content"/> 69 <Button 70 android:text="=" android:id="@+id/ButtonDengyu" 71 android:layout_width="80dip"android:layout_height="wrap_content"/> 72 <Button 73 android:text="/" android:id="@+id/ButtonChu" 74 android:layout_width="80dip"android:layout_height="wrap_content"/> 75 </LinearLayout> <!--LinearLayout布局--> 76 </LinearLayout>
提示:在该xml文件中实现了布局的设置。总的LinearLayout为垂直排列模式,其中垂直排列了四个子LinearLayout,并且每个子LinearLayout为水平排列模式,在每个子LinearLayout中水平排列了4个Button按钮控件。通过对各个控件的属性设置,实现了小型计算器的界面效果。
上面已经介绍了本程序主界面main.xml的开发,接下来将要为读者介绍该小型计算器的功能的实现,代码如下。
代码位置:见随书光盘中源代码/第2章/Sample2_2/src/com/bn/es2b目录下的Sample2_2_Activity.class。
1 package com.bn.es2b; //声明包 2 ......//该处省略了部分类的导入,读者可自行查看随书光盘中源代码 3 import android.view.View.OnClickListener; //导入相关类 4 public class Sample2_2_Activity extends Activity{ //创建继承Activity的类 5 ......//该处省略了成员变量的代码,读者可自行查看随书光盘中源代码 6 public void onCreate(Bundle savedInstanceState){ //继承必须重写的方法 7 super.onCreate(savedInstanceState); //调用父类 8 setContentView(R.layout.main); //跳转到main界面 9 initButton(); //初始化控件 10 buttonC.setOnClickListener( //清空按钮的单击事件监听器 11 new OnClickListener(){ 12 public void onClick(View v){ //重写的onClick方法 13 str1="";str2=""; //设定str1与str2的值 14 tv.setText(str1); //清空记录 15 flag=0; //标志为0 16 } }); 17 for(int i=0;i<buttons.length;i++){ //for循环 18 temp=(Button)findViewById(buttons[i]); //初始化按钮 19 temp.setOnClickListener( //为Button添加监听器 20 new OnClickListener(){ //内部类 21 @Override 22 public void onClick(View v){ //重写的方法 23 str1=tv.getText().toString().trim(); //得到TextView中的字符串 24 str1=str1+String.valueOf(((Button)v).getText());//获得新输入的值 25 tv.setText(str1); //设置TextView 26 } }); } 27 buttonListener(buttonJia,1); //加号的监听器 28 buttonListener(buttonJian,2); //减号的监听器 29 buttonListener(buttonCheng,3); //乘号的监听器 30 buttonListener(buttonChu,4); //除法的监听器 31 buttonDengyu.setOnClickListener( //等号的监听器 32 new OnClickListener(){ //内部类 33 @Override 34 public void onClick(View v){ //重写的方法 35 result1=Integer.parseInt(str1); //字符串转换为int类型 36 if(flag==1){ //判断flag是否为1 37 result=result0+result1; //实现加法 38 System.out.println(result0+":"+result1); 39 }else if(flag==2){ //判断flag是否为2 40 result=result0-result1; //实现减法 41 }else if(flag==3){ //判断flag是否为3 42 result=result0*result1; //实现乘法 43 }else if(flag==4){ //判断flag是否为4 44 result=(int)(result0/result1); //实现除法 45 } 46 String str=(result+"").trim(); //运算结果转换为字符串 47 tv.setText(str); //设置TextView的显示值 48 } }); } 49 public void initButton(){ //初始化控件资源 50 ......//初始化控件的方法,读者可自行查看随书光盘中源代码 51 } 52 public void buttonListener(Button button,final int id){ //对按钮实现监听的方法 53 button.setOnClickListener( //设置监听 54 new OnClickListener(){ 55 public void onClick(View v){ //重写onClick方法 56 String str=tv.getText().toString().trim(); //得到TextView的字符串 57 result0=Integer.parseInt(str); //转换为整型 58 tv.setText(""); //清空 59 flag=id; //设定flag的值 60 } }); } }
其中:
● 第10~16行表示的是对计算器清空按钮的监听,并且实现清空功能。
● 第17~26行表示的是对计算器九个值的按键进行监听。
● 第31~48行表示的是对计算器等号的监听,并且实现基本的四则运算。
● 第52~60行表示的是对计算器运算符按钮的监听。