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>
下一篇: Java实现高效随机数算法的示例代码