iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
0
Mobile Development

菜雞 Android APP 從安裝 Android Studio 到上架 Google Play系列 第 11

Day11 - 跳轉畫面 & ViewPager 元件

有了 MVP 架構,之後書寫起來各位應該會看得比較清楚

接下來我們先新增一個 Activity

接下來我設定,若是登入成功,跳轉畫面

  • 記得先在 interface 加上跳轉的 function

MainActivity

override fun goToMain2() {
    val intent = Intent(this, Main2Activity::class.java) // 設定意圖
    startActivity(intent) // 執行
    finish() // 結束目前的畫面 (有這行,手機返回鍵就不會退回該畫面 )    
}

Presenter

class Presenter(val view: Contract.View) :Contract.Presenter{

    override fun compare(account: String, password: String) {
        if (account == "1234" && password == "5678") {
            view.showSuccess() // 顯示成功訊息
            view.goToMain2() // 跳轉畫面
        } else {
            view.showFailure()
        }
    }

}

【查看效果】

Yes

如果覺得訊息和跳轉畫面太同步,可以用下面的方法延遲幾秒再跳轉,看自己想怎麼調整。

MainActivity

override fun goToMain2() {
    Handler().postDelayed({
        val intent = Intent(this, Main2Activity::class.java)
        startActivity(intent)
        finish()
    },2000) // 設定延遲兩秒 (這裡輸入的是毫秒,轉為秒要除1000)
}

Yes

跳轉後 我們先在 xml 新增一個 ViewPager

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Main2Activity">

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    
</LinearLayout>

先讓大家看一下 ViewPager 呈現出來是什麼樣子

Yes

Q:什麼是 Fragment?

A:Fragment 就是子畫面

一個 ViewPager 裡面可以有很多 Fragment,再利用 ViewPager 滑動的特性去顯示每個子畫面。


ViewPager 最重要的屬性 : Adapter

流程大概是下面這樣

  • 將設計好的 Fragment (子畫面) 丟進 Adapter
  • 將該 Adapter 設定給 ViewPager

程式碼如下,建議新手先照著抄打顯示出來,之後再思考每一行在做什麼

Main2Activity

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

    // 建立一個 Adapter 
    val myAdapter = object : FragmentPagerAdapter(supportFragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {

        // 這個方法需要返回一個你自訂的 Fragment
        override fun getItem(position: Int): Fragment {
            return PagerFragment(position)  
        }

        // 這個方法需要返回 ViewPager 底下子畫面的數量
        override fun getCount(): Int {
            return 5  

    }
    
    // 設定 ViewPager 的 Adapter 屬性
    viewpager.adapter = myAdapter // 設定 adapter 屬性

}

上面 PagerFragment 是我自己創的

要實作 onCreateView 和 onViewCreated 兩個方法

  • onCreateView -> 要返回你的畫面,就是上圖的 xml 檔
  • onViewCreated -> 設定你的元件屬性,畫面創好後才找的到元件
class PagerFragment(val position: Int) : Fragment() {

    // 用 list 暫存背景色
    val colors = listOf(Color.RED, Color.YELLOW, Color.GREEN, Color.BLUE, Color.GRAY)


    // 要返回你的畫面
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        val view = inflater.inflate(R.layout.fragment, container,false)

        return view
    }

    // 設定你的元件屬性
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

        val num = position + 1

        tv_number.apply {
    
            // 設定內容
            text = "這是 Fragment " + num
            
            // 設定背景色
            setBackgroundColor(colors[position])
        }
        super.onViewCreated(view, savedInstanceState)
    }

}

再看一次效果

Yes


上一篇
Day10 - Android App 的 MVP 架構 (2/2)
下一篇
Day12 - 闡述未來畫面概念
系列文
菜雞 Android APP 從安裝 Android Studio 到上架 Google Play30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言