创建实体类
class News(val title: String, val content: String) {}
双页模式
创建两个Fragment布局文件
创建Fragment子类
- 必须重写方法:
- onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View?
将定义的Fragment布局动态加载进来。
- onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View?
- 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
}