实例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行表示的是对计算器运算符按钮的监听。