实验目的

1、熟悉App开发常用的一些中级控件及相关工具,主要包括各种布局用法、特殊按钮的用法、下拉框与基本适配器的用法、编辑框的用法等;
2、掌握Activity的基本概念与常见用法;

实验内容

2.1 房贷计算器

贷款年限和基准利率请参考:https://www.fangdaijisuanqi.com/

2.2 App登录页面

用户类型分为:个人用户和企业用户

实验过程

3.1 房贷计算器

源代码:https://gitee.com/shentuzhigang/mini-project/tree/master/android-fangdaijisuanqi

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:focusableInTouchMode="true"android:clickable="true"android:focusable="true"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="16dp"tools:context=".MainActivity"><ScrollViewandroid:layout_width="match_parent"android:layout_height="wrap_content"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/relativeLayout1"><TextViewandroid:id="@+id/row1label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="购房总价:"android:layout_centerVertical="true"android:textSize="18sp" /><EditTextandroid:id="@+id/row1edit"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerVertical="true"android:hint="请输入购房总价(单位万)"android:singleLine="true"android:textSize="16sp"android:background="@drawable/edittext_style"android:padding="5dp"android:gravity="right"android:layout_toEndOf="@+id/row1label"android:layout_toStartOf="@+id/row1endlabel"android:inputType="numberDecimal"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="万"android:textSize="18sp"android:layout_marginStart="10dp"android:layout_centerVertical="true"android:layout_alignParentEnd="true"android:id="@+id/row1endlabel" /></RelativeLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/relativeLayout2"android:layout_below="@+id/relativeLayout1"android:layout_marginTop="20dp"><TextViewandroid:id="@+id/row2label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按揭部分:"android:layout_centerVertical="true"android:textSize="18sp"/><EditTextandroid:id="@+id/row2edit"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_toStartOf="@+id/row2endlabel"android:layout_toEndOf="@+id/row2label"android:background="@drawable/edittext_style"android:gravity="right"android:hint="请输入按揭百分比"android:inputType="numberDecimal"android:padding="5dp"android:singleLine="true"android:textSize="16dp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text=" %"android:textSize="18sp"android:layout_marginStart="10dp"android:layout_centerVertical="true"android:layout_alignParentEnd="true"android:id="@+id/row2endlabel" /></RelativeLayout><RelativeLayoutandroid:id="@+id/relativeLayout3"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/relativeLayout2"android:layout_marginTop="10dp"><TextViewandroid:id="@+id/row3label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="还款方式:"android:textSize="16sp"android:layout_centerVertical="true"/><RadioGroupandroid:id="@+id/radiogroup"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_toRightOf="@+id/row3label"android:orientation="horizontal"><RadioButtonandroid:id="@+id/btn1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="等额本息"android:checked="true"/><RadioButtonandroid:id="@+id/btn2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="等额本金"android:layout_marginLeft="10dp"/></RadioGroup></RelativeLayout><RelativeLayoutandroid:id="@+id/relativeLayout4"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/relativeLayout3"><CheckBoxandroid:id="@+id/check1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="商贷:    "/><EditTextandroid:id="@+id/row4label"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerVertical="true"android:hint="请输入商业贷款总额(单位万)"android:singleLine="true"android:textSize="16dp"android:background="@drawable/edittext_style"android:padding="5dp"android:gravity="right"android:layout_toRightOf="@+id/check1"android:layout_toLeftOf="@+id/row4endlabel"android:inputType="numberDecimal"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="万"android:textSize="18sp"android:layout_marginLeft="10dp"android:layout_centerVertical="true"android:layout_alignParentEnd="true"android:id="@+id/row4endlabel"/></RelativeLayout><RelativeLayoutandroid:id="@+id/relativeLayout41"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/relativeLayout4"android:layout_marginTop="10dp"><TextViewandroid:id="@+id/row8label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="商贷年限:"android:textSize="16sp"android:layout_centerVertical="true"/><Spinnerandroid:id="@+id/sp1"android:layout_centerVertical="true"android:layout_width="match_parent"android:layout_height="wrap_content"android:spinnerMode="dialog"android:layout_toRightOf="@+id/row8label"></Spinner></RelativeLayout><RelativeLayoutandroid:id="@+id/relativeLayout42"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/relativeLayout41"android:layout_marginTop="10dp"><TextViewandroid:id="@+id/row9label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="商贷利率:"android:layout_centerVertical="true"android:textSize="16sp"/><Spinnerandroid:id="@+id/sp2"android:layout_width="match_parent"android:layout_height="wrap_content"android:spinnerMode="dialog"android:layout_centerVertical="true"android:layout_toRightOf="@+id/row9label"></Spinner></RelativeLayout><RelativeLayoutandroid:id="@+id/relativeLayout5"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/relativeLayout42"android:layout_marginTop="5dp"><CheckBoxandroid:id="@+id/check2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="公积金:"/><EditTextandroid:id="@+id/row5label"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerVertical="true"android:hint="请输入公积金贷款总额(单位万)"android:singleLine="true"android:textSize="16dp"android:background="@drawable/edittext_style"android:padding="5dp"android:gravity="right"android:layout_toRightOf="@+id/check2"android:layout_toLeftOf="@+id/row5endlabel"android:inputType="numberDecimal"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="万"android:textSize="18sp"android:layout_marginLeft="10dp"android:layout_centerVertical="true"android:layout_alignParentEnd="true"android:id="@+id/row5endlabel" /></RelativeLayout><RelativeLayoutandroid:id="@+id/relativeLayout6"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/relativeLayout5"android:layout_marginTop="10dp"><TextViewandroid:id="@+id/row6label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="公积金年限:"android:textSize="16sp"android:layout_centerVertical="true"/><Spinnerandroid:id="@+id/sp3"android:layout_centerVertical="true"android:layout_width="match_parent"android:layout_height="wrap_content"android:spinnerMode="dialog"android:layout_toRightOf="@+id/row6label"></Spinner></RelativeLayout><RelativeLayoutandroid:id="@+id/relativeLayout7"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/relativeLayout6"android:layout_marginTop="10dp"><TextViewandroid:id="@+id/row7label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="公积金利率:"android:layout_centerVertical="true"android:textSize="16sp"/><Spinnerandroid:id="@+id/sp4"android:layout_width="match_parent"android:layout_height="wrap_content"android:spinnerMode="dialog"android:layout_centerVertical="true"android:layout_toRightOf="@+id/row7label"></Spinner></RelativeLayout><Buttonandroid:id="@+id/detail"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/relativeLayout7"android:layout_marginTop="15dp"android:background="@drawable/btn_style"android:text="计算还款明细"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="还款总额为:***万\n其中利息总额为:***万\n月供(每月还款额)为:***"android:layout_below="@+id/detail"android:layout_marginTop="10dp"android:textSize="16sp"android:id="@+id/alldetail"/></RelativeLayout></ScrollView></RelativeLayout>
</layout>
package io.shentuzhigang.demo.fangdaijisuanqiimport android.content.Context
import android.os.Bundle
import android.text.Editable
import android.text.TextUtils
import android.text.TextWatcher
import android.view.inputmethod.InputMethodManager
import android.widget.*
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import io.shentuzhigang.demo.fangdaijisuanqi.databinding.ActivityMainBinding
import io.shentuzhigang.demo.fangdaijisuanqi.util.TextUtilclass MainActivity : AppCompatActivity() {var binding: ActivityMainBinding? = null//声明用到的所有控件var spinner1: Spinner? = nullvar spinner2: Spinner? = nullvar spinner3: Spinner? = nullvar spinner4: Spinner? = nullvar row1edit: EditText? = nullvar row2edit: EditText? = nullvar radioGroup: RadioGroup? = nullvar checkBox1: CheckBox? = nullvar checkBox2: CheckBox? = nullvar row4edit: EditText? = nullvar row5edit: EditText? = nullvar detail: Button? = nullvar alldetail: TextView? = nullprivate fun initSpinner() {//建立数据源val years: Array<String> = getResources().getStringArray(R.array.years)//声明一个下拉列表的数组适配器并绑定数据源val yearAdapter: ArrayAdapter<String> =ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item, years)//绑定Adapter到控件spinner1!!.adapter = yearAdapter//设置默认选择第一项spinner1!!.setSelection(0)//设置标题spinner1!!.prompt = "请选择商贷贷款年限"val oldbaseRates: Array<String> = getResources().getStringArray(R.array.old_base_rate)val oldbaseRatesAdapter: ArrayAdapter<String> =ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item, oldbaseRates)spinner2!!.adapter = oldbaseRatesAdapterspinner2!!.setSelection(0)spinner2!!.prompt = "请选择商贷基准利率"spinner3!!.adapter = yearAdapterspinner3!!.setSelection(0)spinner3!!.prompt = "请选择公积金贷款年限"val baserates: Array<String> = getResources().getStringArray(R.array.base_rate)val baserateAdapter: ArrayAdapter<String> =ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item, baserates)spinner4!!.adapter = baserateAdapterspinner4!!.setSelection(0)spinner4!!.prompt = "请选择公积金基准利率"}//声明下列函数中要用到的变量var buyTotal //购房总额: String? = nullvar percent //贷款百分比: String? = nullvar inTotal = 0.0 // 贷款总额var outTotal = 0.0var backTotal = 0.0 // 还款总额var month //月份= 0override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)binding = DataBindingUtil.setContentView(this, R.layout.activity_main)//初始化控件spinner1 = binding?.sp1spinner2 = binding?.sp2spinner3 = binding?.sp3spinner4 = binding?.sp4row1edit = binding?.row1editrow2edit = binding?.row2editradioGroup = binding?.radiogroupcheckBox1 = binding?.check1checkBox2 = binding?.check2detail = binding?.detailalldetail = binding?.alldetailrow4edit = binding?.row4labelrow5edit = binding?.row5labelinitSpinner()row1edit!!.addTextChangedListener(NumberTextWatcher(row1edit!!))row2edit!!.addTextChangedListener(PercentageTextWatcher(row2edit!!))row4edit!!.addTextChangedListener(NumberTextWatcher(row4edit!!))row5edit!!.addTextChangedListener(NumberTextWatcher(row5edit!!))//点击软键盘外部,收起软键盘row1edit?.setOnFocusChangeListener { view, hasFocus ->if (!hasFocus) {val manager =this@MainActivity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManagermanager.hideSoftInputFromWindow(view.windowToken,InputMethodManager.HIDE_NOT_ALWAYS)}}detail!!.setOnClickListener {val manager =this@MainActivity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManagermanager.hideSoftInputFromWindow(it.windowToken,InputMethodManager.HIDE_NOT_ALWAYS)buyTotal = row1edit!!.text.toString()percent = row2edit!!.text.toString()//判断前两个输入框是否非空if (TextUtils.isEmpty(buyTotal) || TextUtils.isEmpty(percent)) {Toast.makeText(getApplicationContext(), "购房总价和按揭部分信息填写完整", Toast.LENGTH_LONG).show()} else if (!TextUtil.isNum(buyTotal!!) || !TextUtil.isNum(percent!!)) { //判断输入的是否是数字Toast.makeText(this@MainActivity.applicationContext,"包含不合法的输入信息",Toast.LENGTH_LONG).show()} else if (percent!!.toDouble() > 100) { //判断百分比部分输入是否大于100%Toast.makeText(this@MainActivity.applicationContext,"按揭部分不能超过100%",Toast.LENGTH_LONG).show()} else if (TextUtil.isNum(buyTotal!!) && TextUtil.isNum(percent!!)) {inTotal = buyTotal!!.toDouble() * percent!!.toDouble() * 0.01}if (checkBox1!!.isChecked == false && checkBox2!!.isChecked == false) {//监听勾选的多选框Toast.makeText(this@MainActivity, "请勾选贷款种类", Toast.LENGTH_LONG).show()return@setOnClickListener}val first = row4edit!!.text.toString()val second = row5edit!!.text.toString()outTotal = 0.0backTotal = 0.0val array = ArrayList<Double>()if (radioGroup!!.checkedRadioButtonId == R.id.btn1) {// 等额本息贷款算法if (checkBox1!!.isChecked) {// 商业贷款if (first == "请输入商业贷款总额(单位万)") {Toast.makeText(this@MainActivity, "请将空信息填写完整", Toast.LENGTH_LONG).show()}if (!TextUtil.isNum(first)) {Toast.makeText(this@MainActivity, "包含不合法的输入信息", Toast.LENGTH_LONG).show()}val firstTotal = first.toDouble()val firstYear = spinner1!!.selectedItem.toString()val firstMonth = firstYear.substring(0, firstYear.length - 1).toInt() * 12val firstRate =spinner2!!.selectedItem.toString().substring(20, 24).toDouble() * 0.01val firstMonthRate = firstRate / 12outTotal += firstTotalval perTime = firstTotal * firstMonthRate * Math.pow(1 + firstMonthRate,firstMonth.toDouble()) /(Math.pow(1 + firstMonthRate, firstMonth.toDouble()) - 1)for (i in 0 until firstMonth) {if (array.size < i + 1) {array.add(perTime)} else {array.set(i, array.get(i) + perTime)}}backTotal += perTime * firstMonth}if (checkBox2!!.isChecked) {// 公积金贷款if (second == "请输入公积金贷款总额(单位万)") {Toast.makeText(this@MainActivity, "请将空信息填写完整", Toast.LENGTH_LONG).show()}if (!TextUtil.isNum(second)) {Toast.makeText(this@MainActivity, "包含不合法的输入信息", Toast.LENGTH_LONG).show()}val secondTotal = second.toDouble()val secondYear = spinner1!!.selectedItem.toString()val secondMonth = secondYear.substring(0, secondYear.length - 1).toInt() * 12val secondRate =spinner4!!.selectedItem.toString().substring(17, 21).toDouble() * 0.01val secondMonthRate = secondRate / 12outTotal += secondTotalval perTime = secondTotal * secondMonthRate * Math.pow(1 + secondMonthRate,secondMonth.toDouble()) /(Math.pow(1 + secondMonthRate, secondMonth.toDouble()) - 1)for (i in 0 until secondMonth) {if (array.size < i + 1) {array.add(perTime)} else {array.set(i, array.get(i) + perTime)}}backTotal += perTime * secondMonth}} else if (radioGroup!!.checkedRadioButtonId == R.id.btn2) {// 等额本金贷款算法if (checkBox1!!.isChecked) {// 商业贷款if (first == "请输入商业贷款总额(单位万)") {Toast.makeText(this@MainActivity, "请将空信息填写完整", Toast.LENGTH_LONG).show()}if (!TextUtil.isNum(first)) {Toast.makeText(this@MainActivity, "包含不合法的输入信息", Toast.LENGTH_LONG).show()}val firstTotal = first.toDouble()val firstYear = spinner1!!.selectedItem.toString()val firstMonth = firstYear.substring(0, firstYear.length - 1).toInt() * 12val firstRate =spinner2!!.selectedItem.toString().substring(20, 24).toDouble() * 0.01val firstMonthRate = firstRate / 12outTotal += firstTotalvar sum = 0.0for (i in 0 until firstMonth) {val money = firstTotal / firstMonth + (firstTotal - sum) * firstMonthRateif (array.size < i + 1) {array.add(money)} else {array.set(i, array.get(i) + money)}backTotal += array[i]sum += array[i]}}if (checkBox2!!.isChecked) {// 公积金贷款if (second == "请输入公积金贷款总额(单位万)") {Toast.makeText(this@MainActivity, "请将空信息填写完整", Toast.LENGTH_LONG).show()}if (!TextUtil.isNum(second)) {Toast.makeText(this@MainActivity, "包含不合法的输入信息", Toast.LENGTH_LONG).show()}val secondTotal = second.toDouble()val secondYear = spinner1!!.selectedItem.toString()val secondMonth = secondYear.substring(0, secondYear.length - 1).toInt() * 12val secondRate =spinner4!!.selectedItem.toString().substring(17, 21).toDouble() * 0.01val secondMonthRate = secondRate / 12outTotal += secondTotalvar sum = 0.0for (i in 0 until secondMonth) {val money =secondTotal / secondMonth + (secondTotal - sum) * secondMonthRateif (array.size < i + 1) {array.add(money)} else {array.set(i, array.get(i) + money)}backTotal += array[i]sum += array[i]}}}if (String.format("%.2f", outTotal).toDouble() != String.format("%.2f", inTotal).toDouble()) {Toast.makeText(this@MainActivity, "填写的两项贷款总额不等于初始贷款额度,请重新填写", Toast.LENGTH_LONG).show()}var perMonth = "每月还款金额如下:\n"for (i in 0 until array.size) {perMonth += String.format("第%d个月应还金额为:%.2f\n", i + 1, array[i] * 10000)}alldetail!!.text = String.format("您的贷款总额为%.2f万元\n还款总额为%.2f万元\n其中利息总额为%.2f万元\n还款总时间为%d月\n%s",inTotal,backTotal,backTotal - inTotal,array.size,perMonth)}}
}class PercentageTextWatcher(editText: EditText) : TextWatcher {private val editText: EditTextinit {this.editText = editText}private var oldValue = ""override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {val length = charSequence.lengthvar text: String = charSequence.toString()if (length > oldValue.length) {val newchar = charSequence[i]if (newchar < '0' && newchar > '9' && newchar != '.') {if (i != length - 1) {text = oldValue}}}try {val value = text.toDouble()if (value >= 100) {text = oldValue} else if (text.indexOf(".") == -1 || text.indexOf(".") == 0) {text = String.format("%.0f", value)}} catch (e: NumberFormatException) {text = oldValue}if (!charSequence.toString().equals(text)) {this.editText.setText(text)}oldValue = text}override fun afterTextChanged(editable: Editable) {}
}class NumberTextWatcher(editText: EditText) : TextWatcher {private val editText: EditTextinit {this.editText = editText}var oldlength = 0override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {val length = charSequence.lengthif (length > oldlength) {val newchar = charSequence[i]if (newchar < '0' && newchar > '9' && newchar != '.') {if (i != length - 1) {val text = charSequence.subSequence(0, i).toString() +charSequence.subSequence(i + 1, length).toString()this.editText.setText(text)} else editText.setText(charSequence.subSequence(0, length - 1))}}oldlength = length}override fun afterTextChanged(editable: Editable) {}
}

3.2 App登录页面

源代码:https://gitee.com/shentuzhigang/mini-project/tree/master/android-login

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="io.shentuzhigang.demo.login" ><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.LoginApplication" ><activityandroid:name=".MainActivity"android:exported="true" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activityandroid:label="找回密码"android:name=".ForgotPasswordActivity"></activity></application></manifest>
<?xml version="1.0" encoding="utf-8"?>
<layout><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"android:padding="10dp"><RelativeLayoutandroid:id="@+id/relativeLayout3"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"><TextViewandroid:id="@+id/row3label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="登录方式:"android:textSize="16sp"android:layout_centerVertical="true"/><RadioGroupandroid:id="@+id/radiogroup"android:layout_width="match_parent"android:layout_height="wrap_content"tools:layout_editor_absoluteX="124dp"tools:layout_editor_absoluteY="54dp"android:layout_toEndOf="@+id/row3label"android:orientation="horizontal"><RadioButtonandroid:id="@+id/radioButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="密码登录"android:checked="true" /><RadioButtonandroid:id="@+id/radioButton2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="验证码登录"android:layout_marginStart="10dp"/></RadioGroup></RelativeLayout><RelativeLayoutandroid:id="@+id/relativeLayout4"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/relativeLayout3"android:layout_marginTop="10dp"><TextViewandroid:id="@+id/row8label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="用户类型:"android:textSize="16sp"android:layout_centerVertical="true"/><Spinnerandroid:id="@+id/sp1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_toEndOf="@+id/row8label"android:spinnerMode="dropdown" /></RelativeLayout><RelativeLayoutandroid:id="@+id/relativeLayout5"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/relativeLayout4"android:layout_marginTop="10dp"><TextViewandroid:id="@+id/row1label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="手机号码:"android:layout_centerVertical="true"android:textSize="18sp" /><EditTextandroid:id="@+id/edit_phone"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_toEndOf="@+id/row1label"android:gravity="start"android:hint="请输入手机号码"android:inputType="phone"android:maxLength="11"android:padding="5dp"android:singleLine="true"android:textSize="16sp" /></RelativeLayout><RelativeLayoutandroid:id="@+id/relativeLayout6"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/relativeLayout5"android:layout_marginTop="10dp"><TextViewandroid:id="@+id/row2label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="登录密码:"android:layout_centerVertical="true"android:textSize="18sp" /><EditTextandroid:id="@+id/edit_password"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerVertical="true"android:hint="请输入密码"android:singleLine="true"android:textSize="16sp"android:padding="5dp"android:gravity="start"android:layout_toEndOf="@+id/row2label"android:layout_toStartOf="@+id/btn_forgot_password"/><Buttonandroid:id="@+id/btn_forgot_password"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentEnd="true"android:layout_centerVertical="true"android:layout_marginStart="10dp"android:layout_marginEnd="5dp"android:text="忘记密码"android:textSize="18sp" /></RelativeLayout><RelativeLayoutandroid:id="@+id/relativeLayout7"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/relativeLayout6"><CheckBoxandroid:id="@+id/check1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="记住密码"/></RelativeLayout><Buttonandroid:id="@+id/btn_login"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/relativeLayout7"android:text="登录" /></RelativeLayout></androidx.constraintlayout.widget.ConstraintLayout>
</layout>
package io.shentuzhigang.demo.loginimport android.content.DialogInterface
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.Spinner
import androidx.appcompat.app.AlertDialog
import androidx.databinding.DataBindingUtil
import io.shentuzhigang.demo.login.databinding.ActivityMainBindingclass MainActivity : AppCompatActivity() {var binding: ActivityMainBinding? = null//声明用到的所有控件var spinner1: Spinner? = nullprivate fun initSpinner() {//建立数据源val userTypes: Array<String> = getResources().getStringArray(R.array.user_type)//声明一个下拉列表的数组适配器并绑定数据源val userTypeAdapter: ArrayAdapter<String> =ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item, userTypes)//绑定Adapter到控件spinner1!!.adapter = userTypeAdapter//设置默认选择第一项spinner1!!.setSelection(0)//设置标题spinner1!!.prompt = "请选择用户类型"}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)binding = DataBindingUtil.setContentView(this, R.layout.activity_main)//初始化控件spinner1 = binding?.sp1initSpinner()binding?.btnForgotPassword?.setOnClickListener {startActivity(Intent(this@MainActivity, ForgotPasswordActivity::class.java))}binding?.btnLogin?.setOnClickListener {val normalDialog = AlertDialog.Builder(this@MainActivity);normalDialog.setTitle("登录成功")normalDialog.setMessage(binding!!.editPhone.text.toString() + "登录成功");normalDialog.setPositiveButton("确定返回", { dialog, which->//...Todo})normalDialog.setNegativeButton("我再看看",{ dialog, which->//...Todo});// 显示normalDialog.show();}}
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"><data></data><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"android:padding="10dp"><RelativeLayoutandroid:id="@+id/relativeLayout5"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"><TextViewandroid:id="@+id/row1label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="输入新密码:"android:layout_centerVertical="true"android:textSize="18sp" /><EditTextandroid:id="@+id/edit_new1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerVertical="true"android:hint="输入新密码"android:singleLine="true"android:textSize="16sp"android:padding="5dp"android:gravity="start"android:layout_toEndOf="@+id/row1label"android:maxLength="11"android:inputType="phone"/></RelativeLayout><RelativeLayoutandroid:id="@+id/relativeLayout6"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/relativeLayout5"android:layout_marginTop="10dp"><TextViewandroid:id="@+id/row2label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="确认新密码:"android:layout_centerVertical="true"android:textSize="18sp" /><EditTextandroid:id="@+id/edit_new2"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerVertical="true"android:hint="确认新密码"android:singleLine="true"android:textSize="16sp"android:padding="5dp"android:gravity="start"android:layout_toEndOf="@+id/row2label"android:maxLength="11"android:inputType="phone"/></RelativeLayout><RelativeLayoutandroid:id="@+id/relativeLayout7"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/relativeLayout6"android:layout_marginTop="10dp"><TextViewandroid:id="@+id/row3label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="验证码:"android:layout_centerVertical="true"android:textSize="18sp" /><EditTextandroid:id="@+id/edit_password"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerVertical="true"android:hint="请输入验证码"android:singleLine="true"android:textSize="16sp"android:padding="5dp"android:gravity="start"android:layout_toEndOf="@+id/row3label"android:layout_toStartOf="@+id/row2endlabel"/><Buttonandroid:id="@+id/row2endlabel"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentEnd="true"android:layout_centerVertical="true"android:layout_marginStart="10dp"android:layout_marginEnd="5dp"android:text="获取验证码"android:textSize="18sp" /></RelativeLayout><RelativeLayoutandroid:id="@+id/relativeLayout8"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/relativeLayout7"><CheckBoxandroid:id="@+id/check1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="记住密码"/></RelativeLayout><Buttonandroid:id="@+id/btn_submit"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="确定"android:layout_below="@+id/relativeLayout7"/></RelativeLayout></androidx.constraintlayout.widget.ConstraintLayout>
</layout>

实验结果

4.1 房贷计算器

5.2 App登录页面



实验心得

1、熟悉App开发常用的一些中级控件及相关工具,主要包括各种布局用法、
特殊按钮的用法、下拉框与基本适配器的用法、编辑框的用法等;
2、掌握Activity的基本概念与常见用法;

参考项目

  • https://gitee.com/oschina/android-app
  • https://github.com/zdm-code/Android-learning/tree/master/android_learning/mortgage

参考文章

  • Android11——DataBinding的使用
  • Android实战项目:房贷计算器

《移动项目实践》实验报告——Android中级控件相关推荐

  1. 《移动项目实践》实验报告——Android高级控件

    实验目的 1.熟悉App开发常用的一些高级控件及相关工具,主要包括日期时间控件的用法.列表类视图及其适配器的用法.翻页类视图及其适配器的用法.碎片及其适配器的用法等: 2.熟悉四大组件之一广播Broa ...

  2. 《移动项目实践》实验报告——Android初级控件

    实验目的 1.掌握Android屏幕显示与初级视图的相关知识: 2.掌握包括屏幕显示基础.简单布局的用法.简单控件的用法.简单图形的用法 实验内容 以windows上的计算器为例,程序界面如下图所示: ...

  3. 移动开发技术(Android)——实验5 Android高级控件的应用

    移动开发技术--实验5 Android高级控件的应用 一.实验目的 二.实验内容 1.Spinner.ListView控件与Adapter适配器(一) 2.Spinner.ListView控件与Ada ...

  4. 《移动项目实践》实验报告——Android组合控件

    实验目的 1.熟悉App开发常用的一些组合控件,主要包括底部标签栏的实现和用法.顶部导航栏的用法.横幅轮播条的实现和用法.循环视图3种布局的用法.材质设计库3种布局的用法等: 实验内容 仿淘宝主页 上 ...

  5. Android中级控件介绍(五)

    一.相对布局RelativeLayout RelativeLayout的下级视图的位置是相对位置,得有具体的参照物才能确定最终位置. 如果不设定下级视图的参照物,那么下级视图默认显示在Relative ...

  6. 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第五章:中级控件

    第 5 章 中级控件 本章介绍App开发常见的几类中级控件的用法,主要包括:如何定制几种简单的图形.如何使用几种选择按钮.如何高效地输入文本.如何利用对话框获取交互信息等,然后结合本章所学的知识,演示 ...

  7. 20155220 实验三 敏捷开发与XP实践 实验报告

    20155220 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim ...

  8. 20155226 实验三 敏捷开发与XP实践 实验报告

    20155226 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim ...

  9. 《Python程序设计》实验四 Python综合实践实验报告

    <Python程序设计>实验四 Python综合实践实验报告 1.实验内容 Python综合应用:爬虫.数据处理.可视化.机器学习.神经网络.游戏.网络安全等. 在华为ECS服务器(Ope ...

最新文章

  1. Paper1:HoPE: Horizontal Plane Extractor for Cluttered
  2. idea批量修改变量快捷键mac_使用Mac自带功能批量修改图片名称、类型和压缩图片大小...
  3. gif 分支的新建与合并
  4. nginx如何开启debug日志及相关配置
  5. 论优秀的码农,学会这5点!
  6. LINUX中使用fdisk对SD卡磁盘进行格式化并重新分区
  7. oracl的使用命令
  8. html模板自动保存在哪个文件夹,wps的备份文件夹在哪里 wps崩溃自动保存文件在哪里...
  9. 企业为什么要做ISO14001环境管理体系认证?
  10. 计算机cpu温度显示原理,电脑cpu温度怎么看
  11. java编写工字鼠标光标,鼠标指针的形状及含义
  12. ubuntu安装翻译软件 stardict
  13. 程序员零下20度雪地求婚快冻伤 女友却崩溃了
  14. 微信公共平台 首次关注 自动回复消息
  15. 必备单品,FSearch
  16. 耐磨钢球磨耗计算方法
  17. 国王学院计算机科学,伦敦大学国王学院计算机科学本科.pdf
  18. 用volatile的视角,来打开JMM内存模型
  19. 八数码难题的多种解法
  20. Hive中的四种排序

热门文章

  1. That assembly does not allow partially trusted callers.
  2. 查询Windows api
  3. mvc if 显示html,asp.net mvc - 在MVC3 Razor中,如何在动作中获取渲染视图的html?
  4. 与计算机硬件相关领域,计算机硬件相关专业论文范文.doc
  5. nema0183 java解析_NEMA 0183 语句解析
  6. pb 修改数据窗口种指定字段位置_第三章 Python数据类型 容器
  7. mysql模板引擎有哪些_ecshop用的是什么模板引擎?
  8. 微型计算机内存为8m,通常说一台微机的内存容量为8M,指的是_______。
  9. 杭十四计算机教室,杭十四中学生做了个图书馆智能机器人
  10. 无法监控端口_zabbix 监控远程主机端口