《移动项目实践》实验报告——Android中级控件
实验目的
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
<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
<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>
<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();}}
}
<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实战项目:房贷计算器
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
