《移动项目实践》实验报告——Android中级控件
生活随笔
收集整理的這篇文章主要介紹了
《移动项目实践》实验报告——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中级控件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《移动项目实践》实验报告——Androi
- 下一篇: android sina oauth2.