这是我参与「第四届青训营 」笔记创作活动的第11天
笔记
1.Fragment概述
Fragment是一种可以嵌入在Activity当中的UI片段,它能让程序更加合理和充分地利用大屏幕 的空间,因而在平板上应用得非常广泛。虽然Fragment对你来说是个全新的概念,但我相信你 学习起来应该毫不费力,因为它和Activity实在是太像了,同样都能包含布局,同样都有自己的 生命周期。你甚至可以将Fragment理解成一个迷你型的Activity,虽然这个迷你型的Activity 有可能和普通的Activity是一样大的。
2.Fragment的使用方式
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Button"
/>
</LinearLayout>
这个布局非常简单,只放置了一个按钮,并让它水平居中显示。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#00ff00"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="24sp"
android:text="This is right fragment"
/>
</LinearLayout>
可以看到,我们将这个布局的背景色设置成了绿色,并放置了一个TextView用于显示一段文本。
接着新建一个LeftFragment类,并让它继承自Fragment。
class LeftFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.left_fragment, container, false)
}
}
这里仅仅是重写了Fragment的onCreateView()方法,然后在这个方法中通过 LayoutInflater的inflate()方法将刚才定义的left_fragment布局动态加载进来,整个方法 简单明了。接着我们用同样的方法再新建一个RightFragment
最后把这两个Fragment添加到activity_main.xml就可以了。
动态添加Fragment
新建another_right_fragment.xml,代码如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#ffff00"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="24sp"
android:text="This is another right fragment"
/>
</LinearLayout>
然后新建AnotherRightFragment作为另一个右侧Fragment,代码如 下所示:
class AnotherRightFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.another_right_fragment, container, false)
}
}
下面我们将在代码中向FrameLayout里添加内容,从而实现动态添加Fragment的功能。修改 MainActivity中的代码,如下所示:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
replaceFragment(AnotherRightFragment())
}
replaceFragment(RightFragment())
}
private fun replaceFragment(fragment: Fragment) {
val fragmentManager = supportFragmentManager
val transaction = fragmentManager.beginTransaction()
transaction.replace(R.id.rightLayout, fragment)
transaction.commit()
}
}
可以看到,首先我们给左侧Fragment中的按钮注册了一个点击事件,然后调用 replaceFragment()方法动态添加了RightFragment。当点击左侧Fragment中的按钮时, 又会调用replaceFragment()方法,将右侧Fragment替换成AnotherRightFragment。
总结与思考
动态加载Fragment
分为以下五步
- 创建待添加Fragment的实例。
- 获取FragmentManager,在Activity中可以直接调用getSupportFragmentManager() 方法获取。
- 开启一个事务,通过调用beginTransaction()方法开启。
- 向容器内添加或替换Fragment,一般使用replace()方法实现,需要传入容器的id和待添 加的Fragment实例。
- 提交事务,调用commit()方法来完成。
实习Fragment返回栈
虽然实现了向Activity中动态添加Fragment的功能。不过我发现,通过点击按钮添加了一个Fragment之后,这时按下Back键程序就会直接退出。如果我 们想实现类似于返回栈的效果,按下Back键可以回到上一个Fragment,该如何实现呢?
其实很简单,FragmentTransaction中提供了一个addToBackStack()方法,可以用于将一 个事务添加到返回栈中。
private fun replaceFragment(fragment: Fragment) {
val fragmentManager = supportFragmentManager
val transaction = fragmentManager.beginTransaction() transaction.replace(R.id.rightLayout, fragment)
transaction.addToBackStack(null)
transaction.commit() }