Android编程典型实例与项目开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 LinearLayout——线性布局的应用

本节通过LinearLayout线性布局的应用,构建了一个小型的计算器界面。该计算器实现了整数间的加减乘除四则运算。通过本计算器的实现,向读者介绍LinearLayout线性布局的具体应用。

1. 实例概述

本节实现了小型计算器软件的开发。该计算器通过0~9这10个数字按钮,加、减、乘、除和等于5个运算按钮,以及清空按钮来实现对本程序的操控,并通过一个文本框来显示计算的结果。应用本程序可以进行整数间简单的加、减、乘、除四则运算。

2. 运行效果

本案例的运行效果图如图2-2所示。

图2-2 小型计算器

提示:使用者可以通过单击数字输入第一个计算值,然后单击所需计算按钮确定计算方式,再通过单击数字输入第二个计算值,之后当再次单击等于按钮时,软件会自动计算出结果数值,如图2-2所示。

3. 技术概要

小型计算器的开发主要运用了LinearLayout线性布局的相关知识。线性布局是最简单的布局之一,其提供了控件水平或者垂直排列的模型。同时,使用此布局时可以通过设置控件的weight参数控制各个控件在容器中的相对大小。

提示:线性布局垂直时占用一列,水平时占用一行。特别要注意的是,水平时若超过一行则不会像SE中的FlowLayout一样自动转行。

线性布局中可以使用gravity属性设置控件的对齐方式,详情如表2-1所示。

表2.1 线性布局gravity属性表

提示:当需要使用多个属性时,用“|”分隔开即可。

4. 核心代码

首先介绍的是小型计算器的主界面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为垂直排列模式,其中垂直排列了4个子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行表示对计算器的9个值的按键进行监听。

● 第31~48行表示对计算器的等号的监听,并且实现基本的四则运算。

● 第52~60行表示对计算器的运算符按钮的监听。