下面是“Android中你可能不知道的Fragment妙用”的完整攻略。
简介
Fragment 是 Android 开发中非常重要的一个概念,它可以让我们开发出更加灵活、复杂的界面。但是除了 Fragment 常见的使用场景,还有许多我们可能不太熟悉的用法,这篇文章就来介绍一下。
Fragment 的用途
- 多面板界面支持
- 多语言支持
- 直接管理 Fragment 的回退栈
- 共享状态或者行为
多面板界面支持
假如我们的应用需要支持手机和平板两种设备,而在平板的情况下需要使用多面板界面来展示更多的信息。为了实现这个需求,我们可以在手机上使用单面板界面,而在平板上使用多面板界面。
我们可以在布局文件中使用 Fragment 占位符,然后在代码中动态添加或者显示 Fragment,比如下面的例子:
<LinearLayout
orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<FrameLayout
android:id="@+id/fragment_detail_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"/>
</LinearLayout>
我们可以在手机上只使用一个 fragment_container
来显示 Fragment,而在平板上同时使用 fragment_container
和 fragment_detail_container
来显示两个 Fragment。
多语言支持
Fragment 可以用来支持应用中多语言的切换。我们可以为每种语言编写一个 Fragment、创建或者销毁对应的 Fragment 来切换语言。
比如我们可以创建一个叫做 EnglishFragment
的 Fragment 用来展示英文界面,代码如下:
public class EnglishFragment extends Fragment {
...
}
当我们需要切换到英文界面的时候,只需要创建一个 EnglishFragment
并显示它:
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, new EnglishFragment());
transaction.commit();
同样,当我们需要切换到其他语言的界面时,只需要创建对应的 Fragment 并显示它即可。
直接管理 Fragment 的回退栈
在普通的应用中,我们使用回退栈来管理 Activity 的跳转,但是在应用中使用了 Fragment 后,我们需要管理多个 Fragment 的回退,而不是 Activity。
Fragment 的回退栈可以帮助我们实现后退功能,在用户按下后退键的时候,让程序回到上一个 Fragment。我们可以直接管理 Fragment 的回退栈,而不是使用默认的回退栈。
比如我们可以显示一个新的 Fragment 并添加到回退栈中:
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, new NewFragment());
transaction.addToBackStack(null);
transaction.commit();
这样,当用户按下后退键的时候,就可以回到上一个 Fragment 了。
共享状态或者行为
如果多个 Fragment 需要共享数据或者行为,我们可以使用共享 ViewModel。ViewModel 是一个独立于界面的类,用来存储和处理和界面相关的数据。
比如我们可以创建一个继承自 ViewModel 的类,来共享数据和行为:
public class SharedViewModel extends ViewModel {
private MutableLiveData<String> name = new MutableLiveData<>();
public void setName(String newValue) {
name.setValue(newValue);
}
public LiveData<String> getName() {
return name;
}
}
在多个 Fragment 中,我们可以通过获取相同的 ViewModel 实例来共享数据:
public class Fragment1 extends Fragment {
private SharedViewModel viewModel;
public void onCreate(Bundle savedInstanceState) {
viewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
...
}
public void onViewCreated(View view, Bundle savedInstanceState) {
viewModel.getName().observe(getViewLifecycleOwner(), newName -> {
// 更新界面显示的名字
});
...
}
}
public class Fragment2 extends Fragment {
private SharedViewModel viewModel;
public void onCreate(Bundle savedInstanceState) {
viewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
...
}
public void onClick(View view) {
viewModel.setName("New Name");
}
}
以上是 Fragment 的几个常见用法,希望对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android中你可能不知道的Fragment妙用 - Python技术站