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