Fragment用法总结

206 阅读1分钟

创建实体类

class News(val title: String, val content: String) {}

双页模式

创建两个Fragment布局文件

创建Fragment子类

  • 必须重写方法:
    • onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View?
      将定义的Fragment布局动态加载进来。
  • refresh()用于将新闻的标题和内容显示在界面上。
class NewsContentFragment: Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.news_content_frag, container, false)
    }

    fun refresh(title: String, content: String){
        contentlayout.visibility = View.VISIBLE
        newsTitle.text = title
        newsContent.text = content
    }

}

单页模式

创建一个Activity

class NewsContentActivity : AppCompatActivity() {

    companion object{
        fun actionStart(context: Context, title: String, content: String){
            val intent = Intent(context, NewsContentActivity::class.java).apply {
                putExtra("news_title", title)
                putExtra("news_content", content)
            }
            context.startActivity(intent)
        }
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_news_content)

        val title = intent.getStringExtra("news_title")
        val content = intent.getStringExtra("news_content")

        if(title != null && content != null){
            val fragment = newsContentFrag as NewsContentFragment
            fragment.refresh(title, content)
        }

    }
}

创建另一个Fragment

  • 通过在Activity中能否找到一个id为newsContentLayout的View来判断当前是双页模式还是单页模式。
class NewsTitleFragment: Fragment() {
    private var isTowPane = false

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.news_title_frag, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        isTowPane = activity?.findViewById<View>(R.id.newsContentLayout) != null

        val layoutManager = LinearLayoutManager(activity)
        newsTitleRecyclerview.layoutManager = layoutManager

        val adapter = NewsAdapter(getNews())
        newsTitleRecyclerview.adapter = adapter
    }
}
  • 通过isTwoPane变量判断当前是单页还是双页模式。如果是单页模式,就启动一个新的Activity去显示新闻内容,如果是双页模式,就更新NewsFragment里的数据。
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val view = LayoutInflater.from(parent.context).inflate(R.layout.news_item, parent, false)

    val holder = ViewHolder(view)
    holder.itemView.setOnClickListener {
        val news = newsList[holder.bindingAdapterPosition]

        if(isTowPane){
            val fragment = newsContentFrag as NewsContentFragment
            fragment.refresh(news.title, news.content)
        }else{
            NewsContentActivity.actionStart(parent.context, news.title, news.content)
        }
    }

    return holder
}

创建一个layout-sw600dp文件夹,再新建一个activity_main.xml文件

动态添加Fragment

  • addToBackStack(null):用于将事务添加到返回栈中。
private fun replaceFragment(fragment: Fragment){
        val fragmentManager = supportFragmentManager
        val transaction = fragmentManager.beginTransaction()
        transaction.replace(R.id.rightLayout, fragment)
        transaction.addToBackStack(null)
        transaction.commit()
    }

Fragment和Activity之间的交互

在Activity中调用Fragment里的方法

  • 从布局文件中获取Fragment实例:
val fragment = supportFragmentManager.findFragmentById(R.id.leftFrag) as LeftFragment

简化为:

val fragment = leftFrag as LeftFragment

在Fragment中调用Activity里的方法

if(activity != null){
    val mainActivity = activity as MainActivity 
}