• AndroidJetpack Fragment之Navigation和ViewPager2


    新的Fragment导航方式:Navigation

    1.创建若干个fragment

    2.添加导航
    1)新建Navigation:右键res文件夹,New->Android Resource File,Resource Type选择Navigation
    2)添加Freagment:Navagation文件中,点击左上角添加,按顺序添加Fragment,拖动四边的节点可以设置导航顺序
    3)添加HostFragment到container中

    3.添加容器
    activity中拖动添加containers->NavHostFragment并选择Navagation,或者添加代码:

    <fragment
            android:id="@+id/fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:defaultNavHost="true"
            app:navGraph="@navigation/main_nav_controler" />
    

    4.设置跳转

    ​ 指定位置添加代码:

    Navigation.findNavController(btn).navigate(R.id.action_mainFragment_to_detailFragment)
    //navigate的参数为跳转方向,可自动补全
    

    5.设置左上角点击返回
    ```

    private lateinit var mNavController : NavController
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    
        mNavController = Navigation.findNavController(this, R.id.fragment)
        NavigationUI.setupActionBarWithNavController(this, mNavController)
    }
    
    override fun onSupportNavigateUp(): Boolean {
        return mNavController.navigateUp()
    }
    

    6.生命周期:
    切换时销毁上一个Fragment,执行到onDestroy()

    7.数据传递
    1)bundle方式:Navigation.findController(View).navigate(resId, Bundle)
    2)ViewModel方式:和Activity中使用ViewModel类似:在Fragment的onCreateView()中使用 。区别在于:使用DataBinding.inflate()绑定View;onCreateView()返回bind.getRoot()

    新的页面切换控件:ViewPager2

    1. 单独使用ViewPager2,作为ListView

    1.xml:

    <FrameLayout 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=".PagerFragment">
        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/viewpager2"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </FrameLayout>
    

    2.Adapter:

    class PagerPhotoListAdapter : ListAdapter<PhotoItem, PagerPhotoViewHolder>(DIFF_UTIL) {
    
        object DIFF_UTIL : DiffUtil.ItemCallback<PhotoItem>() {
            override fun areItemsTheSame(oldItem: PhotoItem, newItem: PhotoItem) = 
            	oldItem === newItem
    
            override fun areContentsTheSame(oldItem: PhotoItem, newItem: PhotoItem) =
            	oldItem.photoId == newItem.photoId
        }
    
        override fun onCreateViewHolder(parent:ViewGroup, viewType:Int):PagerPhotoViewHolder{
            val view = LayoutInflater.from(parent.context)
            						.inflate(R.layout.pager_photo_view, parent, false)
            return PagerPhotoViewHolder(view)
        }
    
        override fun onBindViewHolder(holder: PagerPhotoViewHolder, position: Int) {
            Glide.with(holder.itemView)
                .load(getItem(position).previewUrl)
                .placeholder(R.drawable.ic_photo_gray_24dp)
                .into(holder.itemView.pagerPhoto)
        }
    }
    
    class PagerPhotoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
    

    3.Activity中使用:

    val photoList = arguments?.getParcelableArrayList<PhotoItem>("PHOTO_LIST")		//获取数据
    PagerPhotoListAdapter().apply {
        viewpager2.adapter = this		//装配适配器
        submitList(photoList)			//装配数据
    }
    
    viewpager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
        override fun onPageSelected(position: Int) {
            super.onPageSelected(position)
            photoTag.text = "${position + 1} / ${photoList?.size}"
        }
    })		//注册分页变化事件
    viewpager2.setCurrentItem(arguments?.getInt("PHOTO_POSITION")?:0, false)
    

    2. TabLayout + ViewPager2

    1.xml:

    <LinearLayout 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"
        android:orientation="vertical"
        tools:context=".MainActivity" >
        
        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tablayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <com.google.android.material.tabs.TabItem
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Monday" />
            <com.google.android.material.tabs.TabItem
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Tuesday" />
            <com.google.android.material.tabs.TabItem
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Wednesday" />
        </com.google.android.material.tabs.TabLayout>
    
        <View
            android:id="@+id/divider"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="?android:attr/listDivider" />
    
        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/view_pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
    

    2.Adapter:

    class TabViewPagerAdapter : FragmentStateAdapter(this) {
        override fun getItemCount() = 3
        override fun createFragment(position: Int) = when(position) {
            0 -> ScaleFragment()
            1 -> RotateFragment()
            else -> TranslateFragment()
        }
    }
    
  • 相关阅读:
    桂林游览3
    其实她们也是屌丝,但2的好像只有我。。。
    屌丝吖
    我觉得拍照这丫头狠有天赋
    《那些年啊,那些事——一个程序员的奋斗史》——56
    《那些年啊,那些事——一个程序员的奋斗史》——57
    《那些年啊,那些事——一个程序员的奋斗史》——57
    《那些年啊,那些事——一个程序员的奋斗史》——56
    《那些年啊,那些事——一个程序员的奋斗史》——59
    《那些年啊,那些事——一个程序员的奋斗史》——58
  • 原文地址:https://www.cnblogs.com/lizhenxin/p/12433692.html
Copyright © 2020-2023  润新知