这次来做一个计算器,这个计算器是我以后要做的一个apk的一部分,先来看一下计算器的功能:在有输入的时候会直接显示结果,也就是监测edittext的变化,这样比较方便,不用点击计算按钮
先总结一下这次遇到的问题:
- TextEdit的监听器是什么?
- 判断TextEdit为空的方法?
- String转double
- double的格式化,即保留三位小数
- TextEdit焦点问题,即默认哪一个TextEdit先获得焦点
- 为程序添加菜单,菜单中添加退出选项
1.控件布局
这里要注意的是TextEdit的类型要选择Number,这样在获得焦点的时候会自动弹出数字输入法
还有一个问题就是焦点的问题,看xml中,这是两个EditText,下面的先获取焦点,就是输入光标先出现在下面这个TextEdit中,对比一下就知道怎么做了
2.实现代码
package com.example.calculator;
import java.text.DecimalFormat;
import com.example.calculator.R.id;
import android.os.Bundle;
import android.R.string;
import android.app.Activity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
//声明对应变量
private EditText textBuy;
private EditText textSell;
private TextView textIncome;
private EditText textp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到这些控件
textBuy = (EditText)findViewById(R.id.editTextBuy);
textSell = (EditText)findViewById(R.id.editTextSell);
textIncome = (TextView)findViewById(R.id.textViewIncome);
textp = (EditText)findViewById(id.editTextp);
textp.setText("0.2");
//内容改变监听器,三个text使用一个监听器
textBuy.addTextChangedListener(textWatcher);
textSell.addTextChangedListener(textWatcher);
textp.addTextChangedListener(textWatcher);
}
private TextWatcher textWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
//EditText内容改变时就是执行这个函数
String buy = textBuy.getText().toString();
String sell = textSell.getText().toString();
String pString = textp.getText().toString();
//只有EditText内容不为空的时候才计算,不然会出现问题
if (buy.length() != 0 && sell.length() != 0 && pString.length() != 0){
//String转double
double p = 1.0 - Double.parseDouble(textp.getText().toString()) / 100.0;
double d = Double.parseDouble(sell) / Double.parseDouble(buy)*p*p - 1.0;
//保留三位小数
DecimalFormat df = new DecimalFormat("#.###");
//显示计算结果
textIncome.setText(df.format(d*100) + "");
}
else {
textIncome.setText("0.000");
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
};
@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);
//菜单中添加一个退出选项
menu.add("退出");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
//退出程序
finish();
return super.onOptionsItemSelected(item);
}
}
其中EditText监听器添加方法:输入完下面这一句时会自动添加
private TextWatcher textWatcher = new TextWatcher() {
菜单点击监听的添加方法:
右键——在弹出的菜单中选择Source——Override/Implement Methods...
在弹出的对话框中选择:onOptionsItemSelected
代码中收益的计算公式:
差不多就这样了,后面想到了再添加