iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
0
自我挑戰組

Android App 初學者從零開始用Kotlin寫APP系列 第 25

<Day25>Navigation component(三)

  • 分享至 

  • xImage
  •  

有了 NavController ,可以調用 navigate() 在各個目的地之間導航 ,可每個reload支援多種導航場景。

取得 NavController 有三種方式:
Fragment.findNavController()
View.findNavController()
Activity.findNavController(viewId: Int)

val action =  SpecifyAmountFragmentDirections
            .actionSpecifyAmountFragmentToConfirmationFragment(amount)
  v.findNavController().navigate(action)

返回上一頁 back / pop page

NavController navigateUp() 和 popBackStack() 都可以返回上一頁,差別為:
popBackStack() 如果當前的返回如上一頁是空的就會error,navigateUp() 則不會,還是停留在當前頁面

class  aFragment : Fragment() {
   //...
   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
       super.onViewCreated(view, savedInstanceState)
       //...
       binding.btn1Fragment.addClickAction {
           Navigation.findNavController(view).popBackStack(R.id.aFragment, false)
       }
   }
}

動手作

實作情境為:點新增跳出輸入畫面,輸入完成後回到上一頁
https://ithelp.ithome.com.tw/upload/images/20201008/20130598tx0oqcvFM1.png

https://ithelp.ithome.com.tw/upload/images/20201008/20130598jCgIygSMbY.png

使用 Safe Args 的 Gradle libary,提供 object 和 builder 用於導航和數據傳遞。

Safe Args 產生 TodoListFragmentDirections class

Safe Args 會生成一個 TodoListFragmentDirections class,其中只包含一個 actionSpecifyAmountFragmentToConfirmationFragment() func 。 NavDirections 並存儲了關聯的操作 ID 和 float 可以將返回的 NavDirections 對象直接傳遞到 navigate()。

class TodoListFragmentDirections private constructor() {
  companion object {
    fun actionMainFragmentToAddTodoFragment(): NavDirections =
        ActionOnlyNavDirections(R.id.actionMainFragmentToAddTodoFragment)
  }
}

使用 Safe Args , buttonAdd click 時,跳轉到actionMainFragmentToAddTodoFragment

class TodoListFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_todo_list, container, false)
    }
   .................
   
        buttonAdd.setOnClickListener {
            findNavController().navigate(TodoListFragmentDirections.actionMainFragmentToAddTodoFragment())
        }
    }
}

輸入完成後,回上一頁

        buttonAdd.setOnClickListener {
            if (editTodo.text.isNullOrEmpty()) {
                editTodo.error = "請輸入你的代辦事項"
            } else {
             ......
                // back to list page
                findNavController().popBackStack()
            }
        }

reference:
https://developer.android.com/guide/navigation/navigation-navigate
reference:https://www.jianshu.com/p/729375b932fe
reference:https://www.notion.so/Navigation-component-9-9-Andy-a1245a1b31c5453fbf1b28f887ec0d73


上一篇
<Day24>Navigation component(二)
下一篇
<Day26> coroutines
系列文
Android App 初學者從零開始用Kotlin寫APP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言