Fragment的产生
在Fragment(android 3.0)诞生前,安卓开发中通常使用Activity来展示界面,但它有一定的局限性:
- 界面中的View控件较多较复杂时,操作麻烦
- 手机和平板中展示的效果不一致
为了在Android上为用户提供动态的、多窗口的交互体验,我们需要将UI组件和Activity操作封装成模块进行使用,使得我们可以在activity中对这些模块进行切入切出操作,而这些模块就是Fragment
Fragment的应用场景
如上是官方给出的一张图片,可以看出,平板电脑因为尺寸较大,展示item详情的FragmentB直接显示在了列表右边区域, 而手机屏幕比较小,故需要跳转才能看到FragmentB,类似的具体的例子:手机和平板中的设置界面
Fragment的使用
- 静态使用Fragment:在activity的XML布局文件中定义fragment
- 动态使用Fragment:在activity运行时用代码动态添加fragment
- v4包下Fragment的使用:为了兼容3.0以前的版本,推荐使用v4包下的Fragment
创建和使用Fragment的步骤:
- 创建子类继承Fragment
- 重写onCreateView()方法定义fragment的布局
- 将fragment引入到Activity中
public class NewsFragment extends Fragment {
/**
* onCreateView是fragment第一次创建绘制用户界面时系统回调的方法
* @param inflater 布局填充器,用于将xml文件转换成view对象
* @param container 当前fragment插入activity的布局视图对象
* @param savedInstanceState 存储上一个fragment的信息
* @return 返回值View表示当前加载的fragment视图,若不提供视图可以返回Null
*/
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//将指定资源的xml文件转换成具体的view对象
View view = inflater.inflate(R.layout.fragment_news,null);
return view;
}
在Activity的布局文件中引用:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.limanma.cr7rm.fragment.NewsFragment"/>
</LinearLayout>
如上就是静态使用fragment的过程,非常简单,接下来看看动态使用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.创建Fragment的管理器对象
FragmentManager manager = getSupportFragmentManager();
//2.开启事务
FragmentTransaction transaction = manager.beginTransaction();
//3.调用事务的动态操作,这里是添加
transaction.add(R.id.fl_container,new NewsFragment());
//4.提交事务
transaction.commit();
}
}
Fragment的生命周期:
Fragment和Activity生命周期的对比:
Fragment与Activity间的通信
- Activity向Fragment传值
- Fragment向Activity传值
- Fragment与Fragment间传递数据
Activity向Fragment传值:Activity调用setArguments()传递数据,Fragment调用getArguments()接收数据
Fragment向Activity传值:接口回调,具体步骤如下:
1.在Fragment中定义传值的回调接口,在生命周期的onAttach()或onCreate()方法中获取接口的实现
public interface TestInterface{
void fromFragmentToActivity(String msg);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
mTestInterface = (TestInterface) getActivity();
}
2.在Fragment需要传值的位置调用回调接口方法传值
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_news, null);
...
mTestInterface.fromFragmentToActivity("哈哈哈");
return view;
}
3.在Activity中实现回调接口并重写回调方法,获取传递过来的值
public class MainActivity extends AppCompatActivity implements NewsFragment.TestInterface {
...
@Override
public void fromFragmentToActivity(String msg) {
Log.i("TAG","从绑定的Fragment传递过来的数据:" + msg);
}
}
Fragment与Fragment间传递数据:
ListFragment和DialogFragment的应用
ListFragment继承于Fragment,ListFragment的内容是以列表(list)的形式显示的,它的简单使用可参照如下链接:
https://www.kancloud.cn/digest/androidtome/117268
DialogFragment在android 3.0时被引入,官方推荐使用DialogFragment来管理对话框,它的详细使用可参照如下链接:
https://blog.csdn.net/lmj623565791/article/details/37815413