Kotlin項目實戰之手機影音---toolbar處理、設置菜單點擊事件處理、設置界面處理


在上一次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>

運行:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM