是什么?
Fragment是应用界面中可以重复使用的一部分,可以定义自己的布局、管理自己的生命周期以及处理自己的输入事件。
如何存在?
Fragment不能独立存在,必须由Activity或者另一个Fragment托管
特点?
模块化:
例:
class ExampleFragment extends Fragment {
public ExampleFragment() {
super(R.layout.example_fragment);
}
}
将下面代码插入到Activity的xml文件中即可:
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.ExampleFragment" />
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
public class ExampleActivity extends AppCompatActivity {
public ExampleActivity() {
super(R.layout.example_activity);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.setReorderingAllowed(true)
.add(R.id.fragment_container_view, ExampleFragment.class, null)
.commit();
}
}
}
注意: 代码中是在savedInstanceStat为null的时候添加,确保界面在首次创建界面的时候添加,当配置变化的时候,不需要重复添加,因为Fragment会从savedInstanceState中恢复。
如果需要传递数据,则实例代码如下:
public class ExampleActivity extends AppCompatActivity {
public ExampleActivity() {
super(R.layout.example_activity);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
//需要传递的数据
Bundle bundle = new Bundle();
bundle.putInt("some_int", 0);
getSupportFragmentManager().beginTransaction()
.setReorderingAllowed(true)
//将bundle作为参数传过去
.add(R.id.fragment_container_view, ExampleFragment.class, bundle)
.commit();
}
}
}
Fragment中接收:
class ExampleFragment extends Fragment {
public ExampleFragment() {
super(R.layout.example_fragment);
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
int someInt = requireArguments().getInt("some_int");
...
}
}
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.fragment_container, ExampleFragment.class, null)
.setReorderingAllowed(true)
.addToBackStack("name") // name can be null
.commit();
ExampleFragment 会替换当前在布局容器中的 fragment(如有),该布局容器由 R.id.fragment_container ID 进行标识。将 fragment 的类提供给 replace() 方法可让 FragmentManager 使用其 FragmentFactory 处理实例化。
setReorderingAllowed(true) 可优化事务中涉及的 fragment 的状态变化,以使动画和过渡正常运行。
调用 addToBackStack() 会将事务提交到返回堆栈。用户稍后可以通过按“返回”按钮反转事务,并恢复上一个 fragment。如果您在一个事务中添加或移除了多个 fragment,弹出返回堆栈时,所有这些操作都会撤消。在 addToBackStack() 调用中提供的可选名称使您能够使用 popBackStack() 弹回到该特定事务。
如果您在执行移除 fragment 的事务时未调用 addToBackStack(),则提交事务时会销毁已移除的 fragment,用户无法返回到该 fragment。如果您在移除某个 fragment 时调用了 addToBackStack(),则该 fragment 只会 STOPPED,稍后当用户返回时它会 RESUMED。在这种情况下,其视图会被销毁。
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.fragment_container, ExampleFragment.class, null)
.setReorderingAllowed(true)
.addToBackStack(null)
.commit();
...
ExampleFragment fragment =
(ExampleFragment) fragmentManager.findFragmentById(R.id.fragment_container);
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.fragment_container, ExampleFragment.class, null, "tag")
.setReorderingAllowed(true)
.addToBackStack(null)
.commit();
...
ExampleFragment fragment = (ExampleFragment) fragmentManager.findFragmentByTag("tag");
假设,使用addToBackStack()提交了FragmentTransaction,从而将Fragment返回到堆栈:
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, ExampleFragment.class, null)
// setReorderingAllowed(true) and the optional string argument for
// addToBackStack() are both required if you want to use saveBackStack().
.setReorderingAllowed(true)
.addToBackStack("replacement")
.commit();
supportFragmentManager.saveBackStack("replacement");
supportFragmentManager.restoreBackStack("replacement");
是什么?
FragmentManager fragmentManager = ...
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
FragmentManager fragmentManager = ...
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 在这里可以添加操作
fragmentTransaction.commit();
FragmentManager fragmentManager = ...
fragmentManager.beginTransaction()
...
.setReorderingAllowed(true)
.commit();
// 创建FRagment和事务
FragmentManager fragmentManager = ...
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setReorderingAllowed(true);
// Replace whatever is in the fragment_container view with this fragment
transaction.replace(R.id.fragment_container, ExampleFragment.class, null);
// 提交事务
transaction.commit();