Android开发实用小工具四——体积转换工具


前言

体积转换工具的开发与实现。


一、效果展示

体积转换工具的开发与实现
体积转换工具的开发与实现

二、代码

准备工作和样式布局与我开发的另一个小工具(长度转换工具)所用一致,详情请看我上一篇文章。
链接: 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) {
	
	}
}

总结

以上就是体积转换工具的开发与实现的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

此名哥已占

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值