靜態配置

延續上一節Fragment

碎碎念

實際上就是將我們的activity_main.xml佈局中添加一個Fragment的佈局, 這樣的好處是 如果只是插入佈局我們不必額外在MainActivity.kt中寫半毛Code。

壞處是當我們Activity在執行時,使用add() replace()將會無法替換掉原本在xml的靜態Fragment, 當然show()和hide()還是正常運作的,

若想用remove()刪了原本的Fragment也是可以, 但我測試過會連該Fragment Layout都一起刪掉 ,等於說無法在執行期間重複利用該佈局。

老實說這樣的Fragment有點鱉腳,但因為這是最簡單的插入方式所以還是紀錄一下。

設計佈局

在activity_main.xml中的Design模式, 挑選fragment移入我們的手機畫面中。

應該會跳出這個畫面,選擇我們上一節定義的TimeFragment。

再拖拉一個按鈕取名為btnShowHide進來, 然後我們剛剛剛丟進來的fragment也取名為demoFragment 並利用ConstraintLayout約束他們的大小。

最快的方式就是將activity_main.xml替換成底下的程式碼

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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="com.example.savesomthingdemo.MainActivity">

    <fragment
        android:id="@+id/demoFragment"
        android:name="com.example.savesomthingdemo.TimeFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/btnShowHide"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btnShowHide"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="隱藏"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent" />
</android.support.constraint.ConstraintLayout>

到這個階段就可以執行看看,你的畫面應該會長這樣。

可以觀察出我們的TimeFragment良好的被擺進demoFragment這個Layout裡面, 而demoFragment底下的"隱藏"按鈕也正常顯示。

接下來定義 隱藏按鈕的內容。

隱藏Fragment (使用hide())

將畫面切到MainActivity.kt 在裡面添加的一個按鈕的點擊監聽器, 裡面定義一個fragmentTrasaction用來對fragment進行操作。

demoFragment.isHidden這應該看程式碼都懂, 如果它是隱藏的就會回傳true,顯示的就會回傳false。

然後最後每個trasaction都要以commit()做為結束, 只有當執行commit()前面呼叫的show()或hide()才會真正執行。

奉上程式碼

package com.example.savesomthingdemo

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        btnShowHide.setOnClickListener {
            val fragmentTrasaction = supportFragmentManager.beginTransaction()

            if (demoFragment.isHidden){
                fragmentTrasaction.show(demoFragment)
                btnShowHide.text = "顯示"
            }else{
                fragmentTrasaction.hide(demoFragment)
                btnShowHide.text = "隱藏"
            }

            fragmentTrasaction.commit()
        }
    }
}

結果如下:

results matching ""

    No results matching ""