因为最近在自学 Android Studio ,所以就想着做一个简单的计算器来巩固一下目前所学的知识。目前的成果如下图:
接下来,我会和大家一起分享我这个计算器APP是如何实现的,也希望大家可以提出好的建议,共同进步!
我们知道,在Android中一共有六大布局,它们分别是线性布局、表格布局、帧布局、相对布局、网格布局和绝对布局(这个绝对布局感觉上已经过时了,因为运行Android应用的手机往往屏幕大小、分辨率都可能存在较大的差异,使用该布局将会很难兼顾)。因此,综合来看,我选择了线性布局和表格布局嵌套来作为我的计算器的界面布局。
紧接着就是一些组件的添加,如Button和TextView等。在这里,大家会看到我的界面都填充得比较完美,我是这样来实现的:
竖直方向上通过设置表格布局的权数来完成,如:
android:layout_weight
水平方向上通过将所以TableRow拉伸来完成,如:
android:stretchColumns
注意:如果此时你发现真机调试的时候组件并没有按照预想的布置,而是有部分组件超出屏幕边缘。如果是出现了这种情况,建议在TableLayout中添加如下代码:
android:shrinkColumns = "*"
这行代码的意思是“将TableLayout中的某个列进行收缩”,由于此处的值为“*”,意为“选中当前所有的列”。这样就能保证所有的组件都在手机屏幕之内了
如果你想对控件添加一些自定义的风格(如圆角、颜色等),就需要创建Drawable资源中的 Shape文件:
<corners android:radius="15dp"/>
最后别忘了在对应的XML布局文件中设置对应的backg属性哦~
提示:如果在进行这一步过程中,MainActivity文件显示出“R文件丢失的错误”(整个MainActivity文件都是红色的,别问我是怎么知道的……),建议马上去检查对应的XML布局文件以及最近新建的文件,看看其中哪一个出现了错误。一般情况下都可以通过网上的示范和Android Studio中的错误提示信息来检查那一部分出了问题
首先,要在MainActivity文件中对控件进行初始化(此处以“0”到“9”为例):
……
public class MainActivity extends AppCompatActivity
Button bt_0,bt_1,bt_2,bt_3,bt_4,bt_5,bt_6,bt_7,bt_8,bt_9;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.layout);
bt_0 = (Button) findViewById(R.id.button_0);
bt_1 = (Button) findViewById(R.id.button_1);
bt_2 = (Button) findViewById(R.id.button_2);
bt_3 = (Button) findViewById(R.id.button_3);
bt_4 = (Button) findViewById(R.id.button_4);
bt_5 = (Button) findViewById(R.id.button_5);
bt_6 = (Button) findViewById(R.id.button_6);
bt_7 = (Button) findViewById(R.id.button_7);
bt_8 = (Button) findViewById(R.id.button_8);
bt_9 = (Button) findViewById(R.id.button_9);
}
……
注意:当控件初始化时,需要调用“findViewById”方法来绑定对应ID的控件,但这个方法返回的是一个“View”类型的对象,故此处我们需要对其进行强制转化。
这样我们在XML文件中布置的控件才真正意义上的初始化,然后我们需要对每个控件添加监听器以便对我们的操作产生对应的行为。
在这里简单介绍实现监听事件的几种方法:
用匿名内部类实现(不要忘记导入有关的包)
bt_0.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
//相应的方法
}
});
用外部类实现监听事件(适用于多个监听控件中有某些相同的“行为”的情况)
//首先先声明一个内部类
class MyOnCilckListener implements View.OnClickListener
{
@Override
public void onClick(View v)
{
//方法A
}
}
//然后在MainActivity中实现监听
bt_0.setOnClickListener(new MyOnClickListener()
{
@Override
public void onClick(View v)
{
super.onClick(View v);
//方法B
}
});
//可以看到,用这种方法实现的监听事件,对象都会有共同的方法(方法A)和独有的方法(方法B)
用接口方式实现监听事件(比较常见的实现方式)
public class MainActivity extends AppCompatActivity implements View.OnClickListener
@Override
protected void onCreate(Bundle savedInstanceState)
{
bt_0.setOnClickListener(this);
}
这样,我们就成功地为对应控件实现了监听事件。到时候在使用应用程序的时候就可以根据我们的输入来实现简单的运算了。这里我就不展示实现简单运算的代码了,一是代码有点长,不太方便全部放上来;二是现在网上有着十分优秀的代码,在这里也实在是不好意思班门弄斧。
(ps:如果对我的代码感兴趣或暂时不清楚该如何实现的话,我会在本篇博客末尾附上这个项目的Github链接,请多多指教~)
其实到了这里,一个十分简单的计算器也就算是完成了。但我参照了一下自己手机上的计算器,发现横屏时可以容纳更多的控件,而且可以切换成为横屏感觉上就很厉害啊~
(当然,除了横屏以外,功能上也还有着不小的差距……)
于是,我就顺便把横屏给实现了,下面是我实现横屏的大致流程:
首先,我们需要创建一个横屏的布局文件
这里就不介绍如何创建了,不懂的朋友可以参考一下网上的做法,我在这里给出一个仅供参考的链接 :android studio创建横屏layout-land
然后,我们需要通过一个控件的监听事件来实现横竖屏的切换(这里用一个Button来实现)
在这里我们通过在监听事件中添加如下代码来完成:
MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//(切换成竖屏)
MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//(切换成横屏)
注意!由于应用程序改变横竖屏状态时会自动地加载不同的XML文件,生命周期也会因此改变。建议在MainActivity文件中添加如下代码:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.layout);
Configuration config = getResources().getConfiguration();
if(config.orientation == Configuration.ORIENTATION_LANDSCAPE)
{
//此处对在横屏布局中增加的控件进行初始化
}
//此处对横竖屏都有的控件进行初始化
}
通过判断当前屏幕状态来选择性地初始化对应控件
下面给出我做的布局文件预览图:
这样,一个简单的计算器就完成了。通过完成这个应用程序,让我可以对所学的知识进行“活学活用”,也让我深刻明白了,对于程序开发这一方向而言,真的是 “纸上得来终觉浅,绝知此事要躬行” 啊!
真的,很多事情在你的思想中可能是这样,但是当你真正去动手操作的时候就会发现,原来很多事情都和想象之中的不太一样。
最后,如果大家对我这个新手做的计算器感兴趣或者说想要提出一些意见或看法的话,欢迎大家从Github下载我的代码进行研究,也真诚地希望大家可以为我指出不足之处,谢谢~
我的简单计算器Github链接