《移动项目实践》实验报告——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
<?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中级控件相关推荐
- 《移动项目实践》实验报告——Android高级控件
实验目的 1.熟悉App开发常用的一些高级控件及相关工具,主要包括日期时间控件的用法.列表类视图及其适配器的用法.翻页类视图及其适配器的用法.碎片及其适配器的用法等: 2.熟悉四大组件之一广播Broa ...
- 《移动项目实践》实验报告——Android初级控件
实验目的 1.掌握Android屏幕显示与初级视图的相关知识: 2.掌握包括屏幕显示基础.简单布局的用法.简单控件的用法.简单图形的用法 实验内容 以windows上的计算器为例,程序界面如下图所示: ...
- 移动开发技术(Android)——实验5 Android高级控件的应用
移动开发技术--实验5 Android高级控件的应用 一.实验目的 二.实验内容 1.Spinner.ListView控件与Adapter适配器(一) 2.Spinner.ListView控件与Ada ...
- 《移动项目实践》实验报告——Android组合控件
实验目的 1.熟悉App开发常用的一些组合控件,主要包括底部标签栏的实现和用法.顶部导航栏的用法.横幅轮播条的实现和用法.循环视图3种布局的用法.材质设计库3种布局的用法等: 实验内容 仿淘宝主页 上 ...
- Android中级控件介绍(五)
一.相对布局RelativeLayout RelativeLayout的下级视图的位置是相对位置,得有具体的参照物才能确定最终位置. 如果不设定下级视图的参照物,那么下级视图默认显示在Relative ...
- 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第五章:中级控件
第 5 章 中级控件 本章介绍App开发常见的几类中级控件的用法,主要包括:如何定制几种简单的图形.如何使用几种选择按钮.如何高效地输入文本.如何利用对话框获取交互信息等,然后结合本章所学的知识,演示 ...
- 20155220 实验三 敏捷开发与XP实践 实验报告
20155220 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim ...
- 20155226 实验三 敏捷开发与XP实践 实验报告
20155226 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim ...
- 《Python程序设计》实验四 Python综合实践实验报告
<Python程序设计>实验四 Python综合实践实验报告 1.实验内容 Python综合应用:爬虫.数据处理.可视化.机器学习.神经网络.游戏.网络安全等. 在华为ECS服务器(Ope ...
最新文章
- Paper1:HoPE: Horizontal Plane Extractor for Cluttered
- idea批量修改变量快捷键mac_使用Mac自带功能批量修改图片名称、类型和压缩图片大小...
- gif 分支的新建与合并
- nginx如何开启debug日志及相关配置
- 论优秀的码农,学会这5点!
- LINUX中使用fdisk对SD卡磁盘进行格式化并重新分区
- oracl的使用命令
- html模板自动保存在哪个文件夹,wps的备份文件夹在哪里 wps崩溃自动保存文件在哪里...
- 企业为什么要做ISO14001环境管理体系认证?
- 计算机cpu温度显示原理,电脑cpu温度怎么看
- java编写工字鼠标光标,鼠标指针的形状及含义
- ubuntu安装翻译软件 stardict
- 程序员零下20度雪地求婚快冻伤 女友却崩溃了
- 微信公共平台 首次关注 自动回复消息
- 必备单品,FSearch
- 耐磨钢球磨耗计算方法
- 国王学院计算机科学,伦敦大学国王学院计算机科学本科.pdf
- 用volatile的视角,来打开JMM内存模型
- 八数码难题的多种解法
- Hive中的四种排序
热门文章
- That assembly does not allow partially trusted callers.
- 查询Windows api
- mvc if 显示html,asp.net mvc - 在MVC3 Razor中,如何在动作中获取渲染视图的html?
- 与计算机硬件相关领域,计算机硬件相关专业论文范文.doc
- nema0183 java解析_NEMA 0183 语句解析
- pb 修改数据窗口种指定字段位置_第三章 Python数据类型 容器
- mysql模板引擎有哪些_ecshop用的是什么模板引擎?
- 微型计算机内存为8m,通常说一台微机的内存容量为8M,指的是_______。
- 杭十四计算机教室,杭十四中学生做了个图书馆智能机器人
- 无法监控端口_zabbix 监控远程主机端口