在上一次https://www.cnblogs.com/webor2006/p/12622874.html已經初步對主界面進行了一個框架布局,目前的樣子如下:

其主界面的布局文件為:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include layout="@layout/toolbar" /> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <com.roughike.bottombar.BottomBar android:id="@+id/bottomBar" android:layout_width="match_parent" android:layout_height="60dp" android:layout_alignParentBottom="true" app:bb_tabXmlResource="@xml/bottombar_tabs" /> </LinearLayout>
下面繼續進行功能的實現。
toolbar處理:
修改背景色:
這里先來處理一下toolbar,先回憶一下最終的效果:

首先背景色不對,目前toolbar的背景用的是主題色:

所有這里將修改一下標題欄的主題色既可:
運行:

標題封裝:
對於標題是每個界面都會要進行處理的,所以這里有必要對它進行一個封裝處理了,這里就學一下在Kotlin中是如何來達到封裝的目的的,跟Java的寫法還是不太一樣的。
這里新建一個封裝管理類:

package com.kotlin.musicplayer.utils /** * 標題欄管理類 */ class ToolBarManager { /** * 初始化主界面的toolbar */ fun initMainToolBar() { //TODO } }
然后這里就跟Java不同的地方出來了,看好了,這里面可以定義一個Toolbar的引用:

但是,很明顯這個Toolbar的初始化應該交由子類來提供,只有具體的界面才知道是什么樣的Toolbar,所以為了不讓它報錯,可以將它聲明成一個接口,此時val的變量就不需要強制初始化而轉由子類來進行:

有了Toolbar的引用,接下來咱們就可以在初始化方法中設置一下主界面的標題:

設置標題:
接下來則可以在MainActivity來實現這個接口並對Toolbar進行初始化,具體如下:

此時就需要來初始化val的變量了:


屬性重寫可以參考:https://www.cnblogs.com/webor2006/p/11203903.html,這里打算用延遲初始化來提高程序的性能,怎么做?

此時看一下lazy函數:

所以為啥咱們調用是這樣的:

另外,貌似之前咱們在學習Kotlin語言時還有一個延遲初始化的方式:

那這倆延遲初始化有啥區別呢?可以參考博主:https://www.jianshu.com/p/e2cb4c65d4ff,簡單來說是lazyinit只能用到var的變量,而by lazy只能用於val的變量,而關於var和val有啥區別這里就不多說了,最最基礎的了,接下來咱們則可以調用初始化方法了,如下:

運行:

另外咱們來打印一下日志,看一下lazy()函數的調用確實是在我們使用了Toolbar之后才執行的么?

運行看一下日志輸出:

嗯,確實是!!
增加設置菜單:
接下來還需要給右側增加一個設置菜單,如下:



其中用到一個圖片:


它其實長這樣:

此時可以在IDE上預覽一下效果:
那此時需要再設置一個屬性才行:
此時咱們再運行看一下:

設置菜單點擊事件處理:
接下來給菜單增加一個點擊事件:

其中這里又得復習一下相關語法了-----對象表達式(Object expression),關於這塊可以參考:https://www.cnblogs.com/webor2006/p/11352421.html,關於它的作用可以大致回顧一下:

也就是在Koltin對於匿名內部類是采用對象表達式的形式來代替的,接下來咱們先來處理點擊邏輯,這里先打個toast看一下:

在Kotlin中木有switch關鍵字,這里是用的when關鍵字,而關於它的用法可以參考:https://www.cnblogs.com/webor2006/p/11186089.html,其中它還簡化的寫法:

運行看一下:

另外對於這個事件監聽代碼在IDE上已經有一個標黃的提示了,很明顯是有更加優化的寫法:

用IDE的向導提示來修改一下,此時代碼就精簡為:

看一下這個回調接口的定義:

其實還可以進一步精簡,這里就涉及到Kotlin調用Java的小細節了,“如果Java接口中只有一個未實現的方法,可以省略接口對象,直接用{}表示未實現的方法”,也就是:

其實這個規則就是Kotlin關於參數是Lambda表達式時直接可以用花括號來進行調用的差不多,回憶一下:

好,邏輯了這么多關於語法的知識,目的就是為了鞏固Kotlin的語法,只有這樣才會對Kotlin掌握得更加得熟練,接下來則需要點擊跳轉到一個設置界面,所以下面來准備一下:

package com.kotlin.musicplayer.ui.activity import com.kotlin.musicplayer.R import com.kotlin.musicplayer.base.BaseActivity /** * 設置界面 */ class SettingsActivity : BaseActivity() { override fun getLayoutId(): Int { return R.layout.activity_settings } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="settings" /> </LinearLayout>

然后點擊時跳轉一下,這里又有一個Koltin的語法出來了:

其中這里獲取Class時后面跟了一個.java,原因是我們的每個Activity繼承的是一個Java的Activity,而非Kotlin的,如下:

而要獲取對應Java的class類就需要用這種語法,關於這塊可以參考:https://www.cnblogs.com/webor2006/p/11571472.html,

好,接下來運行看一下設置界面:

設置界面處理:
接下來則來對設置界面進行調整,先展示一下預期的效果圖:

標題處理:
先來修改toolbar,照之前主界面的toolbar的寫法來:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include layout="@layout/toolbar" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="settings" /> </LinearLayout>
package com.kotlin.musicplayer.ui.activity import androidx.appcompat.widget.Toolbar import com.kotlin.musicplayer.R import com.kotlin.musicplayer.base.BaseActivity import com.kotlin.musicplayer.utils.ToolBarManager import org.jetbrains.anko.find /** * 設置界面 */ class SettingsActivity : BaseActivity(), ToolBarManager { override fun getLayoutId(): Int { return R.layout.activity_settings } override val toolbar by lazy { find<Toolbar>(R.id.toolbar) } override fun initData() { super.initData() initSettingsToolBar() } }
運行看下效果:
設置項處理:
這里采用PreferenceFragment來構造咱們的設置項,所以新建一個Fragment:

package com.kotlin.musicplayer.ui.fragment import android.os.Bundle import android.preference.PreferenceFragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.kotlin.musicplayer.R /** * 設置項 */ class SettingsFragment: PreferenceFragment() { override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { addPreferencesFromResource(R.xml.setting) return super.onCreateView(inflater, container, savedInstanceState) } }
其中配置項是在xml中:
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <Preference android:key="clear_cache" android:title="清除緩存" /> <SwitchPreference android:key="push" android:title="推送通知" /> <SwitchPreference android:key="no_wifi" android:title="非wifi下加載圖片" /> <Preference android:key="about" android:title="關於" /> </PreferenceScreen>
然后將其聲明到Activity布局當中:

運行看一下效果:

使用PreferenceFragment的好處就是對於配置的開關就不需要咱們自己來寫了,它里面已經為我們處理好了,下面咱們來讀取一下開關狀態,看是否能正常的讀取出來:
package com.kotlin.musicplayer.ui.activity import android.preference.PreferenceManager import androidx.appcompat.widget.Toolbar import com.kotlin.musicplayer.R import com.kotlin.musicplayer.base.BaseActivity import com.kotlin.musicplayer.utils.ToolBarManager import org.jetbrains.anko.find /** * 設置界面 */ class SettingsActivity : BaseActivity(), ToolBarManager { override fun getLayoutId(): Int { return R.layout.activity_settings } override val toolbar by lazy { find<Toolbar>(R.id.toolbar) } override fun initData() { super.initData() initSettingsToolBar() println("push checked:" + PreferenceManager.getDefaultSharedPreferences(this).getBoolean("push", false)) } }
其中SP的key則是在xml中配置的:

運行一下:

接下來需要處理“關於”的點擊事件,簡單處理下:
/** * 設置項 */ class SettingsFragment : PreferenceFragment() { override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { addPreferencesFromResource(R.xml.setting) return super.onCreateView(inflater, container, savedInstanceState) } override fun onPreferenceTreeClick(preferenceScreen: PreferenceScreen?, preference: Preference?): Boolean { val key = preference?.key if ("about".equals(key)) { //點擊了關於 activity.startActivity(Intent(activity, AboutActivity::class.java)) } return super.onPreferenceTreeClick(preferenceScreen, preference) } }

package com.kotlin.musicplayer.ui.activity import com.kotlin.musicplayer.R import com.kotlin.musicplayer.base.BaseActivity /** * 關於頁面 */ class AboutActivity : BaseActivity() { override fun getLayoutId(): Int { return R.layout.activity_about } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="這是一款免費的Kotlin視頻播放器" /> </LinearLayout>

運行:

