Fragment使用笔记 | 青训营笔记

141 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第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

分为以下五步

  1. 创建待添加Fragment的实例。
  2. 获取FragmentManager,在Activity中可以直接调用getSupportFragmentManager() 方法获取。
  3. 开启一个事务,通过调用beginTransaction()方法开启。
  4. 向容器内添加或替换Fragment,一般使用replace()方法实现,需要传入容器的id和待添 加的Fragment实例。
  5. 提交事务,调用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() }