本学期的安卓开发学习课程,我们的老师强调自己敲出来点小应用,而不是依赖他的源码学习,所以老师讲过的布局方法以及界面组件和实现组件动作的监听以及对应的响应反馈内容。这一套组合拳打下来,我也基本学会了简单应用的设计与实现,我第一个会的就是计算器,业务逻辑实现的难度不大,可能细节比较多。界面设计目前采用tableLayout布局方法,我觉得gruidlayot布局方法会就更合适,因为比如等于号可能会独占两列,而表格布局难以实现独占两列的情况。至于组件业绩仅有Button这一种组件,可以粘贴复制,因为组件大小基本都一样,主要需要实现的是业务逻辑,比如加减乘除对应的逻辑实现。
1、主界面设计
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="0"
android:textSize="30sp"
android:gravity="right" />
<TableRow >
<Button
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="AC"
android:onClick="clear"/>
<Button
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="ba"
android:onClick="backspace"/>
<Button
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="%"/>
<Button
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="/"
android:onClick="opertatorHan"/>
</TableRow>
<TableRow >
<Button
android:id="@+id/seven"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="7"/>
<Button
android:id="@+id/eight"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="8"/>
<Button
android:id="@+id/nine"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="9"/>
<Button
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="*"
android:onClick="opertatorHan"/>
</TableRow>
<TableRow >
<Button
android:id="@+id/four"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="4"/>
<Button
android:id="@+id/five"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="5"/>
<Button
android:id="@+id/six"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="6"/>
<Button
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="-"
android:onClick="opertatorHan"/>
</TableRow>
<TableRow >
<Button
android:id="@+id/one"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="1"/>
<Button
android:id="@+id/two"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="2"/>
<Button
android:id="@+id/three"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="3"/>
<Button
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="+"
android:onClick="opertatorHan"/>
</TableRow>
<TableRow >
<Button
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="#"/>
<Button
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="0"
android:onClick="zero"/>
<Button
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="."/>
<Button
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="20dp"
android:text="="/>
</TableRow>
</TableLayout>
2、主活动类
package com.example.tablelayouttest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.example.tablelayouttest.utils.StringUtils;
public class MainActivity extends AppCompatActivity {
private Button one = null;
private Button two = null;
private Button three = null;
private Button four = null;
private Button five = null;
private Button six = null;
private Button seven = null;
private Button eight = null;
private Button nine = null;
private TextView msg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.calculator_main);
//初始化组件
initUI();
//设置数字按钮的监听处理(not include 0)
setListeners();
}
private void initUI()
{
one = (Button)findViewById(R.id.one);
two = (Button)findViewById(R.id.two);
three = (Button)findViewById(R.id.three);
four = (Button)findViewById(R.id.four);
five = (Button)findViewById(R.id.five);
six = (Button)findViewById(R.id.six);
seven = (Button)findViewById(R.id.seven);
eight = (Button)findViewById(R.id.eight);
nine = (Button)findViewById(R.id.nine);
msg = (TextView)findViewById(R.id.message);
}
private void setListeners()
{
NumberListener listener = new NumberListener();
one.setOnClickListener(listener);
two.setOnClickListener(listener);
three.setOnClickListener(listener);
four.setOnClickListener(listener);
five.setOnClickListener(listener);
six.setOnClickListener(listener);
seven.setOnClickListener(listener);
eight.setOnClickListener(listener);
nine.setOnClickListener(listener);
}
public void clear(View v)
{
msg.setText("0");
}
public void backspace(View v)
{
//拿到旧字符串
String old = msg.getText().toString();
String new_str = old.substring(0, old.length() - 1);
if(new_str.length() == 0)
{
new_str = "0";
}
msg.setText(new_str);
}
public void zero(View v)
{
//拿到旧字符串
String old = msg.getText().toString();
if(!"0".equals(old))
{
msg.setText(old + "0");
}
}
public void opertatorHan(View v)
{
Button btn = (Button)v;
String old = msg.getText().toString();
String btn_str = btn.getText().toString();
String new_str = "";
String last_old = old.substring(old.length() - 1);
if(".".equals(last_old) || StringUtils.isOperator(last_old))
{
new_str = old.substring(0,old.length() - 1) + btn_str;
}
else
{
new_str = old + btn_str;
}
msg.setText(new_str);
}
class NumberListener implements View.OnClickListener
{
@Override
public void onClick(View view) {
Button b = (Button)view;
String btn_str = b.getText().toString();
String old = msg.getText().toString();
if("0".equals(old))
{
msg.setText(btn_str);
}
else
{
msg.setText(old + btn_str);
}
}
}
}
3、辅助方法类(实现解耦合所以分开写)
package com.example.myapplication;
public class StringUtils {
/*判断最后一个字符是否是操作符*/
public static boolean lastIsOperator(String last_old) {
String []s = {"+","-","*","/"};
Boolean result = null;
for(int i=0;i<=s.length;i++){
if (last_old.equals(s[i]))
result= true;
else
result= false;
}
return result;
}
/*判断最后一个小数点的位置并比较它与最后一个操作符的位置关系,如果在操作符之前且操作符后是数字则可以添加小数点
* 如果操作符就是当前字符串的最后一位字符,则拒绝添加小数点*/
public static String addPinter(String old){
String new_str = old;
/*判断最后一个字符是否是操作符*/
Boolean result = lastIsOperator(old.substring(old.length()-1)) ;
/*判断最后一个小数点在字符串中的位置*/
int pinter = 0;/*记录位置的参数*/
for(int i=old.length()-1;i>=0;i--){
if(old.charAt(i)=='.') {
pinter=i;
break;
}
}
/*判断最后一个操作符在字符串中的位置*/
int operator = 0;/*记录位置的参数*/
String []s = {"+","-","*","/"};
for (int index=old.length()-1;index>=0;index--)
for (int i=0;i<s.length;i++){
if(old.charAt(index)==s[i].charAt(0)){
operator=index;
break;
}
}
/*是否添加小数点得到新串*/
if(result){
new_str = old;
}else {
if(pinter<operator){
new_str = old+".";
}else {
new_str = old;
}
}
return new_str;
}
}