前言
体积转换工具的开发与实现。
一、效果展示
二、代码
准备工作和样式布局与我开发的另一个小工具(长度转换工具)所用一致,详情请看我上一篇文章。
链接: Android开发实用小工具二——长度转换工具
主代码
VolumeConversionActivity.java :
public class VolumeConversionActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemSelectedListener {
// 定义下拉列表需要显示的单位名称
private static final String[] nameArray = {
"立方米", "立方分米", "立方厘米", "立方毫米", "公石", "升",
"分升", "厘升", "毫升", "立方英尺", "立方英寸", "立方码",
"亩英尺"
};
// 定义下拉列表需要显示的单位数组
private static final String[] unitArray = {
"m³", "dm³", "cm³", "mm³", "hl", "l",
"dl", "cl", "ml", "ft³", "in³", "yd³",
"af³"
};
private Spinner sp_select1;
private Spinner sp_select2;
TextView tv_value1;
TextView tv_unit1;
TextView tv_value2;
TextView tv_unit2;
private List<Button> buttonList = new ArrayList<>();
ImageButton iv_del;
// 单位一
private String unit1 = "立方米";
// 单位二
private String unit2 = "立方分米";
// 数值一
private String value1 = "0";
// 数值二
private String value2 = "0";
// 临时数值
private BigDecimal tempValue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_value_conversion);
// 获取控件,并添加点击事件
findViewById(R.id.iv_back).setOnClickListener(this);
sp_select1 = findViewById(R.id.sp_select1);
sp_select2 = findViewById(R.id.sp_select2);
tv_value1 = findViewById(R.id.tv_value1);
tv_unit1 = findViewById(R.id.tv_unit1);
tv_value2 = findViewById(R.id.tv_value2);
tv_unit2 = findViewById(R.id.tv_unit2);
buttonList.add(findViewById(R.id.btn_0));
buttonList.add(findViewById(R.id.btn_1));
buttonList.add(findViewById(R.id.btn_2));
buttonList.add(findViewById(R.id.btn_3));
buttonList.add(findViewById(R.id.btn_4));
buttonList.add(findViewById(R.id.btn_5));
buttonList.add(findViewById(R.id.btn_6));
buttonList.add(findViewById(R.id.btn_7));
buttonList.add(findViewById(R.id.btn_8));
buttonList.add(findViewById(R.id.btn_9));
buttonList.add(findViewById(R.id.btn_pt));
buttonList.add(findViewById(R.id.btn_clr));
iv_del = findViewById(R.id.iv_del);
// 给按钮设置的点击事件
for (Button button : buttonList) {
button.setOnClickListener(this);
}
iv_del.setOnClickListener(this);
// 声明一个映射对象的列表,用于保存名称与单位配对信息
List<Map<String, Object>> list = new ArrayList<>();
// name是名称,unit是单位
for (int i = 0; i < nameArray.length; i++) {
Map<String, Object> item = new HashMap<>();
item.put("name", nameArray[i]);
item.put("unit", unitArray[i]);
list.add(item);
}
// 声明一个下拉列表的简易适配器,其中指定了名称与单位两组数据
SimpleAdapter adapter = new SimpleAdapter(this, list,
R.layout.item_value_conversion,
new String[]{"name", "unit"},
new int[]{R.id.tv_name, R.id.tv_unit});
sp_select1.setAdapter(adapter);
sp_select2.setAdapter(adapter);
// 设置下拉列表默认显示
sp_select1.setSelection(0);
sp_select2.setSelection(1);
// 给下拉框设置选择监听器,一旦用户选中某一项,就触发监听器的 onItemSelected 方法
sp_select1.setOnItemSelectedListener(this);
sp_select2.setOnItemSelectedListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() != R.id.iv_back && v.getId() != R.id.iv_del && v.getId() != R.id.btn_clr && value1.length() >= 20)
return;
String inputText = "";
// 如果不是删除按钮和返回按钮
if (v.getId() != R.id.iv_del && v.getId() != R.id.iv_back) {
inputText = ((TextView) v).getText().toString();
}
switch (v.getId()) {
// 点击了返回按钮
case R.id.iv_back:
finish();
break;
// 点击了清除按钮
case R.id.btn_clr:
clear();
break;
// 点击了删除按钮
case R.id.iv_del:
delete();
break;
// 点击了小数点按钮
case R.id.btn_pt:
if (value1.indexOf(".") == -1)
value1 = value1 + ".";
refreshText();
break;
// 点击了数字按钮
default:
if (value1.equals("0")) {
value1 = inputText;
} else {
value1 = value1 + inputText;
}
operation();
refreshText();
break;
}
}
// 清空并初始化
private void clear() {
value1 = value2 = "0";
refreshText();
}
// 刷新文本显示
private void refreshText() {
tv_value1.setText(value1);
tv_value2.setText(value2);
}
// 回退
private void delete() {
if (value1.length() != 0) {
value1 = value1.substring(0, value1.length() - 1);
if (value1.length() == 0)
value1 = "0";
operation();
refreshText();
}
}
// 运算
private void operation() {
// 将value1转换为临时数值tempValue(立方米)
BigDecimal d1 = new BigDecimal(value1);
switch (unit1) {
case "立方米":
tempValue = d1;
break;
case "立方分米":
tempValue = d1.divide(new BigDecimal("1.0E3"), 20, BigDecimal.ROUND_HALF_UP);
break;
case "立方厘米":
tempValue = d1.divide(new BigDecimal("1.0E6"), 20, BigDecimal.ROUND_HALF_UP);
break;
case "立方毫米":
tempValue = d1.divide(new BigDecimal("1.0E9"), 20, BigDecimal.ROUND_HALF_UP);
break;
case "公石":
tempValue = d1.divide(new BigDecimal(10), 20, BigDecimal.ROUND_HALF_UP);
break;
case "升":
tempValue = d1.divide(new BigDecimal("1.0E3"), 20, BigDecimal.ROUND_HALF_UP);
break;
case "分升":
tempValue = d1.divide(new BigDecimal("1.0E4"), 20, BigDecimal.ROUND_HALF_UP);
break;
case "厘升":
tempValue = d1.divide(new BigDecimal("1.0E5"), 20, BigDecimal.ROUND_HALF_UP);
break;
case "毫升":
tempValue = d1.divide(new BigDecimal("1.0E6"), 20, BigDecimal.ROUND_HALF_UP);
break;
case "立方英尺":
tempValue = d1.multiply(new BigDecimal(0.028316846592));
break;
case "立方英寸":
tempValue = d1.multiply(new BigDecimal(0.000016387064));
break;
case "立方码":
tempValue = d1.multiply(new BigDecimal(0.764554857984));
break;
case "亩英尺":
tempValue = d1.multiply(new BigDecimal(1234));
break;
}
// 将临时数值tempValue(立方米)转换为value2
BigDecimal d2 = new BigDecimal(0);
switch (unit2) {
case "立方米":
d2 = tempValue;
break;
case "立方分米":
d2 = tempValue.multiply(new BigDecimal("1.0E3"));
break;
case "立方厘米":
d2 = tempValue.multiply(new BigDecimal("1.0E6"));
break;
case "立方毫米":
d2 = tempValue.multiply(new BigDecimal("1.0E9"));
break;
case "公石":
d2 = tempValue.multiply(new BigDecimal(10));
break;
case "升":
d2 = tempValue.multiply(new BigDecimal("1.0E3"));
break;
case "分升":
d2 = tempValue.multiply(new BigDecimal("1.0E4"));
break;
case "厘升":
d2 = tempValue.multiply(new BigDecimal("1.0E5"));
break;
case "毫升":
d2 = tempValue.multiply(new BigDecimal("1.0E6"));
break;
case "立方英尺":
d2 = tempValue.divide(new BigDecimal(0.028316846592), 20, BigDecimal.ROUND_HALF_UP);
break;
case "立方英寸":
d2 = tempValue.divide(new BigDecimal(0.000016387064), 20, BigDecimal.ROUND_HALF_UP);
break;
case "立方码":
d2 = tempValue.divide(new BigDecimal(0.764554857984), 20, BigDecimal.ROUND_HALF_UP);
break;
case "亩英尺":
d2 = tempValue.divide(new BigDecimal(1234), 20, BigDecimal.ROUND_HALF_UP);
break;
}
String str = String.valueOf(d2.doubleValue());
String str1 = str.substring(str.length() - 2);
if (str1.equals(".0"))
str = str.substring(0, str.length() - 2);
value2 = str;
}
// 选中某一项之后触发的回调方法
@SuppressLint("ResourceAsColor")
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
TextView tv_unit = adapterView.findViewById(R.id.tv_unit);
tv_unit.setVisibility(GridView.GONE);
if (adapterView.getId() == R.id.sp_select1) {
tv_unit1.setText(unitArray[i]);
unit1 = nameArray[i];
operation();
refreshText();
} else {
tv_unit2.setText(unitArray[i]);
unit2 = nameArray[i];
operation();
refreshText();
}
}
// 什么也没选执行的回调方法
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
}
总结
以上就是体积转换工具的开发与实现的内容。