安装好Android Studio(这里的版本是Android Studio Arctic Fox | 2020.3.1 Patch 4),等待gradle和其他组件自动安装完成,就可以新建工程。这里不讨论安装、配置、新建虚拟设备或连接硬件设备等前置操作,因为网上已有很多资源。这里从新建工程操作完成后开始讲。
项目需求:输入英里(Mile)或公里(Kilometer)值,实现相互转换。
零、项目结构
工程(project)页面是一个树状结构,长下面这样。本文的操作只涉及这两个xml文件和MainActivity(.java)文件,不讨论其他文件。
一. 配置app/res/layout/activity_main.xml
这个文件存放了布局信息。有两个子页面,可视化布局配置Design和代码布局配置Code,这两个子页面也可以选择split同时显示。这里重点讲Design。
Design页面配置很直观方便,就是把Palette里面的View拖拽到页面内。白底页面显示View的外观,蓝底是各个View的名字。添加View后可以修改View的参数,如id、Text等。注意AndroidStudio内View的位置信息不一定是相对于主窗体的,有可能是相对于紧邻的另一个View,具体需要在属性窗体单独配置。若没有Anchor(锚定)View的位置,实际运行调试代码时控件很可能错位,叠在一起或者找不到了,都是可能的(悲)。
其他的属性设置都好说,锚定则不那么显而易见。那么锚定是什么样子呢?
这是锚定后。选中View,被锚定的方向会显示一个带数字的箭头,数字(单位pd)表示相对距离,箭头指向参照物。而属性界面的Constraint Widget中,点击红框内的实心黑点,就可以取消该方向的锚定,取消锚定后黑点变为叉号,点击叉号又可以恢复锚定。修改红框内的数字,可以修改锚定距离值。
值得注意的是,如果参照物是另一个View,两个View之间的距离应该是View1到View2锚定距离+View2到View1的锚定距离。两个距离不必相等。比方说Miles与Kilometers这两个view,Mile到下方的Kilometers相对距离为20,Kilometers到上方的Miles相对距离为70,那么这两个控件的实际距离就是20+70=90。
在主界面放置两个TextView作为提示标签,两个EditText作为输入框,两个Button作为触发控件。在Code子页面修改EditText的属性
android:inputType="numberDecimal"
这样可以保证输入到EditText控件中的值都是Decimal。但这不代表可以忽略异常捕获了,因为用户可能会输入“.”,也可能什么都不输入,保留原有的空值,这些异常输入都可能导致程序崩溃,极度危险。
二、配置MainActivity(.java)
java文件功能强大,可以配置控件动作、逻辑,也可以编辑布局。在java文件中编辑布局更灵活,而不编辑布局则可以实现布局配置与逻辑响应的解耦。这里不在java中编辑布局。
先上代码
package com.example.milekmconversion;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.text.DecimalFormat;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button buttonconvertK2M = (Button)findViewById(R.id.buttonConvertK2SM);
Button buttonconvertM2K = (Button)findViewById(R.id.buttonConvertM2K);
EditText textMile = (EditText)findViewById(R.id.textMile);
EditText textKm = (EditText)findViewById(R.id.textKm);
DecimalFormat format = new DecimalFormat("##.##");
double k = 1.609;
buttonconvertK2M.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try{
double km = Double.parseDouble(textKm.getText().toString());
double mile = km/k;
textMile.setText(format.format(mile));
}
catch(Exception e){
Toast.makeText(getApplicationContext(), "Please enter a valid number for kms", Toast.LENGTH_SHORT).show();
}
}
});
buttonconvertM2K.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try{
double mile = Double.parseDouble(textMile.getText().toString());
double km = mile*k;
textKm.setText(format.format(km));
}
catch (Exception e){
Toast.makeText(getApplicationContext(),"Please enter a valid number for miles",Toast.LENGTH_SHORT).show();
}
}
});
}
}
解释几个基础的语法点
1.
setContentView(R.layout.activity_main);
这个语句把MainActivity.java和上面配置的activity_main.xml布局为文件关联起来
2.
Button buttonconvertK2M = (Button)findViewById(R.id.buttonConvertK2SM);
findViewById方法的参数是view的id值,注意R.id.不能省略。
3.
DecimalFormat format = new DecimalFormat("##.##");
//给mile赋值
textMile.setText(format.format(mile));
构建DecimalFormat的一个实例format,"##.##"表示最多保留两位小数,format.format((decimal) mile)表示把decimal类型的参数转换为format格式的文本类型。setText方法则把EditText类型的textMile控件的Text值设置为该文本。
4.
Toast.makeText(getApplicationContext(), "Please enter a valid number for kms", Toast.LENGTH_SHORT).show();
Toast类的maketext().show()操作可以实现弹窗。注意没有show()就不会弹窗。第三个参数可以选择Toast.LENGTH_SHORT或Toast.LENGTH_LONG,short弹窗时间为2s,long为3.5s。
5.
buttonconvertK2M.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try{
double km = Double.parseDouble(textKm.getText().toString());
double mile = km/k;
textMile.setText(format.format(mile));
}
catch(Exception e){
Toast.makeText(getApplicationContext(), "Please enter a valid number for kms", Toast.LENGTH_SHORT).show();
}
}
});
给按钮控件添加单击事件监听响应有很多方法,这里介绍其中一种,即setOnClickListener()方法。
代码完成后,点击“运行”,就可以在虚拟设备或实体手机上查看app实际效果啦。
如果你对安卓开发感兴趣,欢迎留言提需求,博主会天天向上,尽力满足你的~