《移动项目实践》实验报告——Android高级控件
實(shí)驗(yàn)?zāi)康?/h1>
1、熟悉App開(kāi)發(fā)常用的一些高級(jí)控件及相關(guān)工具,主要包括日期時(shí)間控件的用法、列表類(lèi)視圖及其適配器的用法、翻頁(yè)類(lèi)視圖及其適配器的用法、碎片及其適配器的用法等;
2、熟悉四大組件之一廣播Broadcast的基本概念與常見(jiàn)用法;
實(shí)驗(yàn)內(nèi)容
1、萬(wàn)年歷:最簡(jiǎn)單的時(shí)間功能僅能查看當(dāng)前的年月日、時(shí)分秒,若要拓展它的功能,則可由日歷變?cè)職v,在年月日之外補(bǔ)充星期幾,再添加節(jié)假日描述。進(jìn)一步升級(jí)擴(kuò)展,由月歷變年歷,分別按公歷與農(nóng)歷紀(jì)年,便成了萬(wàn)年歷;
萬(wàn)年歷的界面效果
2、日程表(日程提醒采用手機(jī)震動(dòng)的方式):日程表不但支持基本的日歷信息展示,而且支持用戶設(shè)定每天的日程安排,還支持日程提醒時(shí)間。
日程表的主頁(yè)面
日程安排/詳情頁(yè)面
實(shí)驗(yàn)過(guò)程(實(shí)驗(yàn)的設(shè)計(jì)思路、關(guān)鍵源代碼等)
源代碼:https://gitee.com/shentuzhigang/mini-project/tree/master/android-calendar
package io.shentuzhigang.demo.calendarimport android.annotation.SuppressLint import android.graphics.Color import android.os.Bundle import android.util.TypedValue import android.view.View import android.widget.LinearLayout import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.viewpager.widget.PagerTabStrip import androidx.viewpager.widget.ViewPager import io.shentuzhigang.demo.calendar.util.DateUtil import io.shentuzhigang.demo.calendar.widget.MonthPicker import io.shentuzhigang.demo.calendar.adapter.CalendarPagerAdapter @SuppressLint("SetTextI18n") class CalendarActivity : AppCompatActivity(), View.OnClickListener {private var ll_calendar_main // 聲明一個(gè)萬(wàn)年歷區(qū)域的線性布局對(duì)象: LinearLayout? = nullprivate var ll_month_select // 聲明一個(gè)月份選擇區(qū)域的線性布局對(duì)象: LinearLayout? = nullprivate var mp_month // 聲明一個(gè)月份選擇器對(duì)象: MonthPicker? = nullprivate var vp_calendar // 聲明一個(gè)翻頁(yè)視圖對(duì)象: ViewPager? = nullprivate var tv_calendar // 聲明一個(gè)選中年份的文本視圖對(duì)象: TextView? = nullprivate var isShowSelect = false // 是否顯示月份選擇器private var mSelectedYear = 2000 // 當(dāng)前選中的年份override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_calendar)ll_calendar_main = findViewById(R.id.ll_calendar_main)ll_month_select = findViewById(R.id.ll_month_select)// 從布局文件中獲取名叫mp_month的月份選擇器mp_month = findViewById<MonthPicker>(R.id.mp_month)// 從布局文件中獲取名叫pts_calendar的翻頁(yè)標(biāo)題欄findViewById<View>(R.id.btn_ok).setOnClickListener(this)val pts_calendar = findViewById<PagerTabStrip>(R.id.pts_calendar)pts_calendar.setTextSize(TypedValue.COMPLEX_UNIT_SP, 17f)pts_calendar.setTextColor(Color.BLACK)// 從布局文件中獲取名叫vp_calendar的翻頁(yè)視圖vp_calendar = findViewById(R.id.vp_calendar)tv_calendar = findViewById(R.id.tv_calendar)with(tv_calendar){this?.setOnClickListener(this@CalendarActivity)}// 萬(wàn)年歷默認(rèn)顯示當(dāng)前年月的月歷showCalendar(DateUtil.nowYear, DateUtil.nowMonth)}// 顯示指定年月的萬(wàn)年歷private fun showCalendar(year: Int, month: Int) {// 如果指定年份不是上次選中的年份,則需重新構(gòu)建該年份的年歷if (year != mSelectedYear) {tv_calendar!!.text = year.toString() + "年"// 構(gòu)建一個(gè)指定年份的年歷翻頁(yè)適配器val adapter = CalendarPagerAdapter(supportFragmentManager, year)// 給vp_calendar設(shè)置年歷翻頁(yè)適配器vp_calendar!!.adapter = adaptermSelectedYear = year}// 設(shè)置vp_calendar默認(rèn)顯示指定月份的月歷頁(yè)vp_calendar!!.currentItem = month - 1}override fun onClick(v: View) {if (v.id == R.id.tv_calendar) { // 點(diǎn)擊了年份文本// 重新選擇萬(wàn)年歷的年月resetPage()} else if (v.id == R.id.btn_ok) { // 點(diǎn)擊了確定按鈕// 根據(jù)月份選擇器上設(shè)定的年月,刷新萬(wàn)年歷的顯示界面showCalendar(mp_month!!.getYear(), mp_month!!.getMonth() + 1)resetPage()}}// 重置頁(yè)面。在顯示萬(wàn)年歷主頁(yè)面和顯示月份選擇器之間切換private fun resetPage() {isShowSelect = !isShowSelectll_calendar_main!!.visibility = if (isShowSelect) View.GONE else View.VISIBLEll_month_select!!.visibility = if (isShowSelect) View.VISIBLE else View.GONE}companion object {private const val TAG = "CalendarActivity"} } package io.shentuzhigang.demo.calendarimport android.content.* import android.graphics.Color import android.os.* import android.util.Log import android.util.TypedValue import android.widget.LinearLayout import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.viewpager.widget.PagerTabStrip import androidx.viewpager.widget.ViewPager import androidx.viewpager.widget.ViewPager.OnPageChangeListener import io.shentuzhigang.demo.calendar.adapter.SchedulePagerAdapter import io.shentuzhigang.demo.calendar.calendar.SpecialCalendar import io.shentuzhigang.demo.calendar.util.DateUtilclass ScheduleActivity : AppCompatActivity() {private var ll_schedule // 聲明一個(gè)日程表區(qū)域的線性布局對(duì)象: LinearLayout? = nullprivate var vp_schedule // 聲明一個(gè)翻頁(yè)視圖對(duì)象: ViewPager? = nullprivate var mSelectedWeek // 當(dāng)前選中的星期= 0private var mFestivalResid = 0 // 節(jié)日?qǐng)D片的資源編號(hào)override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_schedule)// 從布局文件中獲取名叫pts_schedule的翻頁(yè)標(biāo)題欄val pts_schedule = findViewById<PagerTabStrip>(R.id.pts_schedule)pts_schedule.setTextSize(TypedValue.COMPLEX_UNIT_SP, 17f)pts_schedule.setTextColor(Color.BLACK)ll_schedule = findViewById(R.id.ll_schedule)// 從布局文件中獲取名叫vp_schedule的翻頁(yè)視圖vp_schedule = findViewById(R.id.vp_schedule)val tv_schedule = findViewById<TextView>(R.id.tv_schedule)tv_schedule.setText(DateUtil.nowYearCN + " 日程安排")// 獲取今天所處的星期在一年當(dāng)中的序號(hào)mSelectedWeek = SpecialCalendar.todayWeek// 構(gòu)建一個(gè)日程表的翻頁(yè)適配器val adapter = SchedulePagerAdapter(supportFragmentManager)// 給vp_schedule設(shè)置日程表翻頁(yè)適配器with(vp_schedule) {// 給vp_schedule設(shè)置日程表翻頁(yè)適配器this?.setAdapter(adapter)// 設(shè)置vp_schedule默認(rèn)顯示當(dāng)前周數(shù)的日程頁(yè)this?.setCurrentItem(mSelectedWeek - 1)// 給vp_schedule添加頁(yè)面變化監(jiān)聽(tīng)器this?.addOnPageChangeListener(SheduleChangeListener())}// 延遲50毫秒再執(zhí)行任務(wù)mFirstmHandler.postDelayed(mFirst, 50)}private val mHandler = Handler() // 聲明一個(gè)處理器對(duì)象// 聲明一個(gè)首次打開(kāi)頁(yè)面需要延遲執(zhí)行的任務(wù)private val mFirst = Runnable {sendBroadcast(mSelectedWeek) // 發(fā)送廣播,表示當(dāng)前是在第幾個(gè)星期}// 發(fā)送當(dāng)前周數(shù)的廣播private fun sendBroadcast(week: Int) {// 創(chuàng)建一個(gè)廣播事件的意圖val intent = Intent(ACTION_FRAGMENT_SELECTED)intent.putExtra(EXTRA_SELECTED_WEEK, week)// 通過(guò)本地的廣播管理器來(lái)發(fā)送廣播LocalBroadcastManager.getInstance(this).sendBroadcast(intent)}public override fun onStart() {super.onStart()// 創(chuàng)建一個(gè)節(jié)日?qǐng)D片的廣播接收器festivalReceiver = FestivalControlReceiver()// 注冊(cè)廣播接收器,注冊(cè)之后才能正常接收廣播LocalBroadcastManager.getInstance(this).registerReceiver(festivalReceiver!!, IntentFilter(ACTION_SHOW_FESTIVAL))}public override fun onStop() {super.onStop()// 注銷(xiāo)廣播接收器,注銷(xiāo)之后就不再接收廣播LocalBroadcastManager.getInstance(this).unregisterReceiver(festivalReceiver!!)}override fun onResume() {super.onResume()if (mFestivalResid != 0) { // 在橫屏和豎屏之間翻轉(zhuǎn)時(shí),不會(huì)重新onCreate,只會(huì)onResumell_schedule!!.setBackgroundResource(mFestivalResid)}}// 聲明一個(gè)節(jié)日?qǐng)D片的廣播接收器private var festivalReceiver: FestivalControlReceiver? = null// 定義一個(gè)廣播接收器,用于處理節(jié)日?qǐng)D片事件private inner class FestivalControlReceiver : BroadcastReceiver() {// 一旦接收到節(jié)日?qǐng)D片的廣播,馬上觸發(fā)接收器的onReceive方法override fun onReceive(context: Context, intent: Intent) {if (intent != null) {// 從廣播消息中取出節(jié)日?qǐng)D片的資源編號(hào)mFestivalResid = intent.getIntExtra(EXTRA_FESTIVAL_RES, 1)// 把頁(yè)面背景設(shè)置為廣播發(fā)來(lái)的節(jié)日?qǐng)D片ll_schedule!!.setBackgroundResource(mFestivalResid)}}}// 定義一個(gè)頁(yè)面變化監(jiān)聽(tīng)器,用于處理翻頁(yè)視圖的翻頁(yè)事件inner class SheduleChangeListener : OnPageChangeListener {// 在翻頁(yè)結(jié)束后觸發(fā)override fun onPageSelected(position: Int) {Log.d(TAG, "onPageSelected position=$position, mSelectedWeek=$mSelectedWeek")mSelectedWeek = position + 1sendBroadcast(mSelectedWeek)}// 在翻頁(yè)過(guò)程中觸發(fā)override fun onPageScrolled(position: Int,positionOffset: Float,positionOffsetPixels: Int) {}// 翻頁(yè)狀態(tài)改變時(shí)觸發(fā)override fun onPageScrollStateChanged(arg0: Int) {}}companion object {private const val TAG = "ScheduleActivity"// 聲明一個(gè)碎片選中事件的標(biāo)識(shí)串var ACTION_FRAGMENT_SELECTED = "io.shentuzhigang.demo.calendar.ACTION_FRAGMENT_SELECTED"// 聲明一個(gè)選擇星期參數(shù)的標(biāo)識(shí)串var EXTRA_SELECTED_WEEK = "selected_week"// 聲明一個(gè)顯示節(jié)日事件的標(biāo)識(shí)串var ACTION_SHOW_FESTIVAL = "io.shentuzhigang.demo.calendar.ACTION_SHOW_FESTIVAL"// 聲明一個(gè)節(jié)日?qǐng)D片參數(shù)的標(biāo)識(shí)串var EXTRA_FESTIVAL_RES = "festival_res"} }實(shí)驗(yàn)結(jié)果(實(shí)驗(yàn)最終作品截圖說(shuō)明)
實(shí)驗(yàn)心得
1、熟悉App開(kāi)發(fā)常用的一些高級(jí)控件及相關(guān)工具,主要包括日期時(shí)間控件的用法、列表類(lèi)視圖及其適配器的用法、翻頁(yè)類(lèi)視圖及其適配器的用法、碎片及其適配器的用法等;
2、熟悉四大組件之一廣播Broadcast的基本概念與常見(jiàn)用法;
參考項(xiàng)目
參考文章
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的《移动项目实践》实验报告——Android高级控件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《移动项目实践》实验报告——Androi
- 下一篇: 《移动项目实践》实验报告——Androi