文章目录
Fragment的概念与使用
1. Fragment概述
1.1 介绍
Fragment是一种可以嵌入在活动中的UI片段,能够让程序更加合理和充分地利用大屏幕的空间,出现的初衷是为了适应大屏幕的平板电脑,可以将其看成一个小型的Activity,又称作Activity片段。
从官方的定义可以得到:
- Fragment依赖于Activity,不能独立存在。
- 一个Activity可以拥有多个Fragment
- 一个Fragment可以被多个Activity重用
- 有自己的生命周期,能接收输入事件
- 可以在Activity运行时动态添加和删除Fragment
Fragment的优势
- 模块化:不必将所有代码写进Activity中,写在各自Fragment中就可。
- 可重用:多个Activity可以使用一个Fragment
- 可适配不同屏幕大小、方向等。
1.2 生命周期
2.Fragment使用
有静态调用和动态调用两种
静态调用是用name
指定一个.class
文件的路径,在这个.class
文件中使用onCreateView
方法,创建并返回一个View显示出来。而创建部分,则通过inflater的inflate方法
,传入一个要显示的XML文件。
<!-- 静态调用 -->
<fragment
android:id="@+id/image_fragment"
android:name="com.example.fragmentdemo.ImageViewFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="3"></fragment>
动态调用是在MainActivity.java
文件的onCreate方法中这样操作一下
FragmentManager fm = getSupportFragmentManager();
// 片段管理器
fm.beginTransaction().add(R.id.listFragment , new ListViewFragment()).commit();
// 开始一个事物 添加(容器 , 片段) 提交当前操作
传入的ID
则是主XML文件中的动态调用部分的ID名
传入的对象
是👉创建要显示View的.java文件
的对象,这个对象onCreateView
一个View并返回
👇XML文件是这样的
<!-- 动态调用 -->
<HorizontalScrollView 这个名LinearLayout也行 都行
android:id="@+id/listFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"></HorizontalScrollView>
3.Fragment的动态添加和移除
- 先获取一个片段
FragmentManager fm = getSupportFragmentManager();
Fragment frag = fm.findFragmentById(R.id.listFragment); // 获取片段 传的是Fragment的ID
- 移除一个片段
fm.beginTransaction().remove(frag).commit(); // 移除片段
// 要删除的片段
- 添加一个片段
fm.beginTransaction().add(R.id.listFragment , new ListViewFragment()).commit();
// 添加到这个ID 从这创建和返回 最后提交
👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆
Fragment之间的通信
1. MainActivity和Fragment的
在MainActivity.java中添加onStart(){}方法,这个方法会在页面创建之后开始执行
使用Avtivity中的方法findViewById,通过ID找到你要操作的地方,更改就可以。
---------------------------------------------
这是一个例子👇:
@Override
protected void onStart() {
super.onStart();
final ImageView img_fra = findViewById(R.id.image_view); // 先获取上面的显示的ImageView
for(int i = 0; i < img.length; i ++ ){
ImageView iv = (ImageView) findViewById(img[i]);
if(iv!=null) {
// 存在 则设置点击监听
iv.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) { // 这个view是被点击的东西
ImageView view1 = (ImageView) view;
img_fra.setImageDrawable(view1.getDrawable());
}
});
}
}
}
2. Fragment和自己
在用来创建片段的java文件中(就是onCreate那个),新建onActivityCreated方法
还是使用Avtivity中的方法findViewById,通过ID找到你要操作的地方。
但不可以直接用,因为这是在别的java文件中,不是MainActivity.java中,不可以直接使用这个方法。
需要this.getActivity().findViewById();
--------------------------------------------------
这是一个例子👇:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final ImageView img_fra = this.getActivity().findViewById(R.id.image_view); // 先获取上面的显示的ImageView
for(int i = 0; i < img.length; i ++ ){
ImageView iv = (ImageView) this.getActivity().findViewById(img[i]);
if(iv!=null) {
// 存在 则设置点击监听
iv.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) { // 这个view是被点击的东西
ImageView view1 = (ImageView) view;
img_fra.setImageDrawable(view1.getDrawable());
}
});
}
}
}
更建议使用第二种
- 因为第一种需要记住很多很多Fragment的信息,而第二种可以在各自内部处理
- Fragment1并不知道Fragment2的存在,只有在Activity中创建好才能知道,即当activity的onCreate方法执行完,Fragment才能彼此看见对方
- 此时是Fragment的回调方法OnActivityCreated()执行的时刻,所以把空间获取操作和事件处理代码放在这。
fragment之间不能操作 activity才能操作所有fragment
3. 通过接口实现Fragment和Activity的通信
这种方法是安卓的官方文档中的