Android中使用GridLayout网格布局来制作简单的计算器App

关于GridLayout

在android4.0版本之前,如果想要达到网格布局的效果,首先可以考虑使用最常见的LinearLayout布局,但是这样的排布会产生如下几点问题:

1、不能同时在X,Y轴方向上进行控件的对齐。
2、当多层布局嵌套时会有性能问题。
3、不能稳定地支持一些支持自由编辑布局的工具。

其次考虑使用表格布局TabelLayout,这种方式会把包含的元素以行和列的形式进行排列,每行为一个TableRow对象,也可以是一个View对象,而在TableRow中还可以继续添加其他的控件,每添加一个子控件就成为一列。但是使用这种布局可能会出现不能将控件占据多个行或列的问题,而且渲染速度也不能得到很好的保证。

android4.0以上版本出现的GridLayout布局解决了以上问题。GridLayout布局使用虚细线将布局划分为行、列和单元格,也支持一个控件在行、列上都有交错排列。而GridLayout使用的其实是跟LinearLayout类似的API,只不过是修改了一下相关的标签而已,所以对于开发者来说,掌握GridLayout还是很容易的事情。GridLayout的布局策略简单分为以下三个部分:
首先它与LinearLayout布局一样,也分为水平和垂直两种方式,默认是水平布局,一个控件挨着一个控件从左到右依次排列,但是通过指定android:columnCount设置列数的属性后,控件会自动换行进行排列。另一方面,对于GridLayout布局中的子控件,默认按照wrap_content的方式设置其显示,这只需要在GridLayout布局中显式声明即可。

其次,若要指定某控件显示在固定的行或列,只需设置该子控件的android:layout_row和android:layout_column属性即可,但是需要注意:android:layout_row=”0”表示从第一行开始,android:layout_column=”0”表示从第一列开始,这与编程语言中一维数组的赋值情况类似。

最后,如果需要设置某控件跨越多行或多列,只需将该子控件的android:layout_rowSpan或者layout_columnSpan属性设置为数值,再设置其layout_gravity属性为fill即可,前一个设置表明该控件跨越的行数或列数,后一个设置表明该控件填满所跨越的整行或整列。

计算器实例

通过Android4.0 网格布局GridLayout来实现一个简单的计算器界面布局   源码如下(欢迎大家指导 批评 ):

package com.android.xiong.gridlayoutTest; 

import java.math.BigDecimal;
import java.util.regex.Pattern; 

import com.android.xiong.gridlayoutTest.R.id; 

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridLayout;
import android.widget.TextView; 

public class MainActivity extends Activity { 

  private EditText print; 

  private static String fistNumber = "0";// 第一次输入的值
  private static String secondNumber = "0";// 第二次输入的值
  private static String num = "0";// 显示的结果
  private static int flg = 0;// 结果累加一次
  public Counts take = null; 

  private int[] btidTake = { R.id.txtdivide, R.id.txtx, R.id.txtmin,
      R.id.txttakesum }; 

  private Button[] buttonTake = new Button[btidTake.length]; 

  private int[] btidNum = { R.id.txt0, R.id.txt1, R.id.txt2, R.id.txt3,
      R.id.txt4, R.id.txt5, R.id.txt6, R.id.txt7, R.id.txt8, R.id.txt9,
      R.id.txtspl };
  private Button[] buttons = new Button[btidNum.length]; 

  private int[] btcl = { R.id.chars, R.id.charx, R.id.txtb, R.id.txtv };
  private Button[] btcls = new Button[btcl.length];
  private GridLayout gly; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    gly=(GridLayout)findViewById(R.id.gly);
    print = (EditText) findViewById(R.id.print);
    print.setText("0");
    print.setEnabled(false);
    GetNumber get = new GetNumber();
    for (int i = 0; i < btidNum.length; i++) {
      buttons[i] = (Button) findViewById(btidNum[i]);
      buttons[i].setOnClickListener(get);
    }
    Compute cm = new Compute();
    for (int i = 0; i < btidTake.length; i++) {
      buttonTake[i] = (Button) findViewById(btidTake[i]);
      buttonTake[i].setOnClickListener(cm);
    } 

    Button eq = (Button) findViewById(R.id.txteq); 

    eq.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        if (flg == 0) {
          secondNumber = print.getText().toString();
          if (take == Counts.DIVIDE && secondNumber.equals("0")) {
            print.setText("0不能为被除数");
          } else {
            num = take.Values(fistNumber, secondNumber);
            fistNumber = num;
            secondNumber = "0";
            print.setText(num);
            flg = 1;
            gly.setBackgroundResource(R.drawable.jz);
          }
        }
      }
    });
    Button cleargo = (Button) findViewById(R.id.cleargo);
    cleargo.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        if (num.length() > 1) {
          num = num.substring(0, num.length() - 1);
        } else {
          num = "0";
        }
        print.setText(num);
      }
    });
    Button clear = (Button) findViewById(R.id.clear);
    clear.setOnClickListener(new OnClickListener() { 

      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        num = "0";
        fistNumber = secondNumber = num;
        print.setText(num);
        flg = 0;
      }
    });
    for (int i = 0; i < btcl.length; i++) {
      btcls[i] = (Button) findViewById(btcl[i]);
      btcls[i].setOnClickListener(new OnTake());
    }
  } 

  // 给 EditText赋值
  class GetNumber implements OnClickListener { 

    @Override
    public void onClick(View v) {
      // TODO Auto-generated method stub
      if (flg == 1)
        num = "0";
      if (num.equals("0")) {
        print.setText("");
        num = v.getId() == R.id.txtspl ? "0" : "";
      }
      String txt = ((Button) v).getText().toString();
      boolean s = Pattern.matches("-*(\\d+).?(\\d)*", num + txt);
      num = s ? (num + txt) : num;
      gly.setBackgroundResource(R.drawable.js);
      print.setText(num);
    }
  } 

  // 根据条件计算
  class Compute implements OnClickListener { 

    @Override
    public void onClick(View arg0) { 

      fistNumber = print.getText().toString();
      // TODO Auto-generated method stub
      switch (arg0.getId()) {
      case R.id.txttakesum:
        take = Counts.ADD;
        break;
      case R.id.txtmin:
        take = Counts.MINUS;
        break;
      case R.id.txtx:
        take = Counts.MULTIPLY;
        break;
      case R.id.txtdivide:
        take = Counts.DIVIDE;
        break;
      }
      num = "0";
      flg = 0;
      gly.setBackgroundResource(R.drawable.js);
    } 

  } 

  class OnTake implements OnClickListener { 

    @Override
    public void onClick(View v) {
      // TODO Auto-generated method stub
      switch (v.getId()) {
      case R.id.chars:
        num = "-" + num;
        break;
      case R.id.charx:
        if(!num.equals("0"))
        num = BigDecimal.valueOf(1).divide(new BigDecimal(num),12,BigDecimal.ROUND_UP).stripTrailingZeros()
            .toString();
        break;
      case R.id.txtb:
        num = new BigDecimal(num).divide(BigDecimal.valueOf(100),12,BigDecimal.ROUND_UP).stripTrailingZeros()
            .toString();
        break;
      case R.id.txtv:
        Double numss = Math.sqrt(new BigDecimal(num).doubleValue());
        int stratindex=numss.toString().contains(".")?numss.toString().indexOf("."):0;
        num = numss.toString().length()>13?numss.toString().substring(0, 12+stratindex):numss.toString();
      }
      print.setText(num);
      flg=0;
      num = "0"; 

    } 

  } 

  @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;
  } 

}
package com.android.xiong.gridlayoutTest; 

import java.math.BigDecimal; 

public enum Counts {
  ADD, MINUS, MULTIPLY, DIVIDE, MARK, ROOT;
  public String Values(String num1, String num2) {
    BigDecimal number1 = new BigDecimal(num1);
    BigDecimal number2 = new BigDecimal(num2);
    BigDecimal number = BigDecimal.valueOf(0);
    switch (this) {
    case ADD:
      number = number1.add(number2);
      break;
    case MINUS:
      number = number1.subtract(number2);
      break;
    case MULTIPLY:
      number = number1.multiply(number2);
      break;
    case DIVIDE:
      number = number1.divide(number2,20,BigDecimal.ROUND_UP);
      break; 

    }
    return number.stripTrailingZeros().toString(); 

  } 

}
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_marginTop="40px"
  android:columnCount="5"
  android:rowCount="6"
  tools:context=".MainActivity" > 

  <EditText
    android:id="@+id/print"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_columnSpan="5"
    android:layout_marginLeft="2px"
    android:layout_marginRight="2px"
    android:layout_row="0"
    android:background="#eee" /> 

  <Button
    android:id="@+id/cleargo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="0"
    android:layout_row="1"
    android:text="《--" /> 

  <Button
    android:id="@+id/clear"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="3"
    android:layout_columnSpan="2"
    android:layout_row="1"
    android:layout_gravity="fill_horizontal"
    android:text="清屏" /> 

  <Button
    android:id="@+id/chars"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="1"
    android:layout_row="1"
    android:text="-/+" /> 

  <Button
    android:id="@+id/charx"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="2"
    android:layout_row="1"
    android:text="1/x" /> 

  <Button
    android:id="@+id/txt7"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="0"
    android:layout_row="2"
    android:text="7" /> 

  <Button
    android:id="@+id/txt8"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="1"
    android:layout_row="2"
    android:text="8" /> 

  <Button
    android:id="@+id/txt9"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="2"
    android:layout_row="2"
    android:text="9" /> 

  <Button
    android:id="@+id/txtdivide"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="3"
    android:layout_row="2"
    android:text="÷" /> 

  <Button
    android:id="@+id/txtb"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="4"
    android:layout_row="2"
    android:text="%" /> 

  <Button
    android:id="@+id/txt4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="0"
    android:layout_row="3"
    android:text="4" /> 

  <Button
    android:id="@+id/txt5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="1"
    android:layout_row="3"
    android:text="5" /> 

  <Button
    android:id="@+id/txt6"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="2"
    android:layout_row="3"
    android:text="6" /> 

  <Button
    android:id="@+id/txtx"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="3"
    android:layout_row="3"
    android:text="X" /> 

  <Button
    android:id="@+id/txtv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="4"
    android:layout_row="3"
    android:text="√" /> 

  <Button
    android:id="@+id/txt1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="0"
    android:layout_row="4"
    android:text="1" /> 

  <Button
    android:id="@+id/txt2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="1"
    android:layout_row="4"
    android:text="2" /> 

  <Button
    android:id="@+id/txt3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="2"
    android:layout_row="4"
    android:text="3" /> 

  <Button
    android:id="@+id/txtmin"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="3"
    android:layout_row="4"
    android:text="-" /> 

  <Button
    android:id="@+id/txteq"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="4"
    android:layout_gravity="fill_vertical"
    android:layout_row="4"
    android:layout_rowSpan="2"
    android:text="=" /> 

  <Button
    android:id="@+id/txt0"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="0"
    android:layout_columnSpan="2"
    android:layout_gravity="fill_horizontal"
    android:layout_row="5"
    android:text="0" /> 

  <Button
    android:id="@+id/txtspl"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="2"
    android:layout_row="5"
    android:text="." /> 

  <Button
    android:id="@+id/txttakesum"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_column="3"
    android:layout_row="5"
    android:text="+" /> 

</GridLayout> 
(0)

相关推荐

  • android计算器简单实现代码

    本文实例为大家分享了android计算器的具体实现代码,供大家参考,具体内容如下 java代码: package com.itheima74.simplecalculator4; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; imp

  • Android计算器简单逻辑实现实例分享

    引言: 我的android计算器的实现方式是:按钮输入一次,就处理一次. 但是如果你学过数据结构(栈),就可以使用表达式解析(前缀,后缀)处理. 而这个方式已经很成熟了,但是时间有限,只完成了这个简单的计算器. 至于,这个Android的布局已经在我博客中发布了,不再讲述. 复制代码 代码如下: package com.example.androidlessontwo; import android.os.Bundle;import android.app.Activity;import and

  • 从零开始学android实现计算器功能示例分享(计算器源码)

    下面是效果展示: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match

  • Android实战教程第一篇之最简单的计算器

    从今天开始,本专栏持续更新Android简易实战类博客文章.和以往专栏不同,此专栏只有实例.每个实例尽量按照知识点对应相应一章节的内容去写,循序渐进.有些实例可能会与另一个专栏有重复的文章. 开始本专栏的第一个简易案例: 首先设置两个布局文件,一个布局文件进行输入数据,获取加法运算:另一个布局文件进行显示最终结果.Activity1启动Activity2,并传递计算结果值给Activity2. main.xml: <?xml version="1.0" encoding=&quo

  • android计时器,时间计算器的实现方法

    需求:默认为"00:00:00",点击开始按钮时清零后开始计时,出现如10:28:34.点击停止的时候停止计时.问题:使用Calendar DateFormat的方法,不设置时区获取到的小时是本地时区的(东八区的就是8),设置成GMT标准时区获取到的时间是12小时(12:00:00),设置24小时制无效.在开始时间加减各种小时都无效,而且计时只能到12小时就自动跳上去了,始终无法出现默认状态00:00:00开始计时的效果.尝试各种时间设置方法无效后只能自己写一个根据秒数转换时间格式字符

  • android计算器代码示例分享

    复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><EditText    android:id="@+id/editText1"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:ems="10&quo

  • Android计算器编写代码

    其实这个安卓计算机,所有的后台思想与<C#计算器编写代码>是一模一样的.Win窗体程序移植到安卓,从C#到Java其实很简单的,因为两者的基本语法都很相像,唯一的难点是安卓的xml布局部分,不像C#窗体能够直接拖.  还是如下图一个能够完成基本四则运算的计算器: 先在res\values\strings.xml设置按钮相应的字体,以免布局文件警告满天飞: <?xml version="1.0" encoding="utf-8"?> <r

  • 简单实现Android计算器功能

    自己写的安卓的计算器: 注:这个是在mac中开发的,如果要在windows的eclipse中运行可能会出现路径问题,解决办法从windows中已有的安卓工程根目录下复制一下classpath文件,然后复制粘贴覆盖掉这个工程根目录里面的路径文件,再导入工程应该就可以打开了.  安卓计算器Android <wbr>calculator 工程下载链接:https://github.com/jiangxh1992/Android-Calculator 代码: package com.example.c

  • Android中使用GridLayout网格布局来制作简单的计算器App

    关于GridLayout 在android4.0版本之前,如果想要达到网格布局的效果,首先可以考虑使用最常见的LinearLayout布局,但是这样的排布会产生如下几点问题: 1.不能同时在X,Y轴方向上进行控件的对齐. 2.当多层布局嵌套时会有性能问题. 3.不能稳定地支持一些支持自由编辑布局的工具. 其次考虑使用表格布局TabelLayout,这种方式会把包含的元素以行和列的形式进行排列,每行为一个TableRow对象,也可以是一个View对象,而在TableRow中还可以继续添加其他的控件

  • Android布局之GridLayout网格布局

    网格布局标签是GridLayout.这个布局是android4.0新增的布局.这个布局只有4.0之后的版本才能使用. 不过新增了一些东东 ①跟LinearLayout(线性布局)一样,他可以设置容器中组件的对齐方式 ②容器中的组件可以跨多行也可以跨多列(相比TableLayout直接放组件,占一行相比较) 因为是android 4.0新增的,API Level 14,在这个版本以前的sdk 都需要导入项目,等下会详细介绍 常用属性: 排列对齐: ①设置组件的排列方式:   android:ori

  • Android应用开发中使用GridView网格布局的代码示例

    基本布局演示 1. 定义包含GridView 的 main.xmk <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fi

  • Android 中RecyclerView多种item布局的写法(头布局+脚布局)

    RecyclerView多个item布局的写法(头布局+脚布局) 上图 github 下载源码 Initial commit第一次提交的代码,为本文内容 以下的为主要代码,看注释即可,比较简单 MainActivity 含上拉加载更多 package com.anew.recyclerviewall; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivi

  • 探究Android中ListView复用导致布局错乱的解决方案

    首先来说一下具体的需求是什么样的: 需求如图所示,这里面有ABCD四个选项的题目,当点击A选项,如果A是正确的答案,则变成对勾的图案,如果是错误答案,则变成错误的图案,这里当时在写的时候觉得很简单,只要是在点击的时候判断我点击的选项与正确答案是否一样,是一样就将图片换成正确的样式,如果不一样就换成错误的样式,于是我便写了下面的代码(只贴出了核心Adapter中的代码) package com.fizzer.anbangproject_dahuo_test.Adapter; import andr

  • Android 中自定义ContentProvider与ContentObserver的使用简单实例

    Android 中自定义ContentProvider与ContentObserver的使用简单实例 示例说明: 该示例中一共包含两个工程.其中一个工程完成了自定义ContentProvider,另外一个工程用于测试该自定义ContentProvider且在该工程中使用了ContentObserver监听自定义ContentProvider的数据变化 以下代码为工程TestContentProvider ContentProviderTest如下: package cn.testcontentp

  • JavaScript制作简单网页计算器

    本文实例为大家分享了JavaScript制作简单网页计算器的具体代码,供大家参考,具体内容如下 一.题目 利用JavaScript中的函数,完成数字加.减.乘.除的运算,实现一个简单的计算器. 二.代码 <!doctype html> <html> <head> <meta charset="utf-8"> <title>网页计算器</title> </head>   <body> <

  • 详解jQuery移动页面开发中的ui-grid网格布局使用

    在移动设备上,屏幕宽度狭窄,因此通常不使用多栏布局,但是有时你可能需要将小的元素(如按钮或并排导航标签,例如)多列排列在一起.Jquery Mobile 框架提供了一种简单的方法构建基于css 的分栏布局,叫做ui-grid Jquery Mobile 提供有四个预设的布局,可以在任何情况下都需要列 两列(使用ui-grid-a类) 三列(使用ui-grid-b类) 四列(使用ui-grid-c类) 五列(使用ui-grid-d类) 网格是100%的宽度,完全看不见的(没有边界或背景)和没有ma

  • Android中在GridView网格视图上实现item拖拽交换的方法

    GridView基础 新建一个HelloGridView的工程 修改main.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gridview" android:layout_width=&q

  • JavaSwing GridLayout 网格布局的实现代码

    1. 概述 官方JavaDocsApi: java.awt.GridLayout GridLayout,网格布局管理器.它以矩形网格形式对容器的组件进行布置,把容器按行列分成大小相等的矩形网格,一个网格中放置一个组件,组件宽高自动撑满网格. 以行数和总数优先: 通过构造方法或 setRows 和 setColumns 方法将行数和列数都设置为非零值时,指定的列数将被忽略.列数通过指定的行数和布局中的组件总数来确定.因此,例如,如果指定了三行和两列,在布局中添加了九个组件,则它们将显示为三行三列.

随机推荐