Fragment是android的四大组件之一;
是一个碎片(Fragment);碎片是活动的一部分,使得活动更加的模块化设计。我们可以认为碎片是一种子活动。
- 碎片拥有自己的布局,自己的行为及自己的生命周期回调。
- 当活动在运行的时候,你可以在活动中添加或者移除碎片。
- 你可以合并多个碎片在一个单一的活动中来构建多栏的UI。
- 碎片可以被用在多个活动中。
- 碎片的生命周期和它的宿主活动紧密关联。这意味着活动被暂停,所有活动中的碎片被停止。
- 碎片可以实现行为而没有用户界面组件。
onAttach(Activity):
onCreateView(LayoutInflater,ViewGroup,Bundle):创建fragement视图时调用
onActivityCreated(Bundle):
onDestoryView():与onCreateView()相对;
onDetach():与onAttach(Activity)相对
在类fragment中你可以重写的方法列表:
- onAttach(): 碎片实例被关联到活动实例。碎片和活动还没有完全初始化。通常,你在该方法中获取到活动的引用,在碎片将来的初始化工作中被使用。
- onCreate(): 当创建碎片时,系统调用该方法。你需要初始化一些碎片的必要组件。这些组件是当碎片被暂停、停止时需要保留的,以便被恢复。
- onCreateView(): 当碎片将要第一次绘制它的用户界面时系统调用该方法。为了绘制碎片的UI,你需要从该方法中返回一个代表碎片根布局的View组件。如果该碎片不提供用户界面,直接返回null。
- onActivityCreated: 当宿主活动被创建,在onCreateView()方法之后调用该方法。活动和碎片实例与活动的视图层级被创建。这时,视图可以通过findViewById()方法来访问。在这个方法中,你可以实例化需要Context对象的对象。
- onStart(): 碎片可见时调用该方法。
- onResume(): 碎片可交互时调用该方法。
- onPause(): 当首次表明用户将要离开碎片时系统调用该方法。通常,这里你需要提交任何的会超出用户会话的持久化的变化。
- onStop(): 碎片将要被停止时调用。
- onDestroyView(): 调用该方法后,碎片将要被销毁。
- onDestroy(): 该方法被用来清理碎片的状态。但在Android平台并不保证一定被调用。
摘自添加链接描述
碎片类型:
- 单帧碎片 - 单帧碎片被如移动电话之类的手持设备使用。一个碎片如同一个视频一样显示。
- 列表碎片 - 包含有特殊列表视图的碎片被叫做列表碎片。
- 碎片过渡 - 与碎片事务一起使用。可以从一个碎片移动到另外一个碎片。
开始构建:
1.创建Fragment对应的XML文件;
2.创建Fragment的Java文件(继承于Fragment);
3.向Activity容器内添加碎片
4. Activity的Java类文件中获取到FragmentManager,
可以直接调用getSupportFragmentManager()方法得到
ps:
Fragment通过getActivity()可以获取所在的Activity,
Activity通过FragmentManager的findFragmentById或findFragmentByTag()来获取Fragment
1,首先我们新建一个fragment的布局文件:
一个简单的带有按钮,和Textview的文件,
2,我们实现Fragment 的类:
public class myfragment extends Fragment {//myfragment实现Fragment
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//在创建fragment UI界面时调用,返回一个代表根布局的View,如果没有创建view则返回null
View view=inflater.inflate(R.layout.fragement,container,false);//初定义布局
Button button=view.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override //将fragment布局中的button与MainActivity中的textView连接
public void onClick(View v) {
TextView textView=getActivity().findViewById(R.id.textView2);//用getActivity()来获取当前对象
textView.setText("来自fragment的值"+System.currentTimeMillis());
}
});
return view;
}
}
3 向Activity容器内添加碎片
MainActivity的布局文件
在插入fragment时设置fragment组件属性:
android:name=“所引用fragment类的路径”//这里是fragment包里的fragment.java文件
4 设置MainActivity了;
public class MainActivity extends AppCompatActivity {
ListView listView;
ArrayAdapter<String> adapter;
String []name={"斯卡哈","斯卡蒂"};
String []content={"1号文字","2号文字"};
FragmentManager manager;//通过manger实现对fragment的操作
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=findViewById(R.id.listview);
adapter=new ArrayAdapter<String>(MainActivity.this,R.layout.item,name);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
textView.setText(content[position]);
}
});
//其实下面这一块是对fragment的操作,如果只要显示的话到这里就结束了;
manager=getSupportFragmentManager();//获取manager对象
myfragment myfragment1=(myfragment)manager.findFragmentById(R.id.fragment);//实际操作是靠定义fragment的类来的,所以将manager找到的类赋值
final TextView textView=myfragment1.getView().findViewById(R.id.textView);//Activity实现对Fragment的操作;
}
}
Fragment常用的三个类:
android.app.Fragment主要用于定义Fragment
android.app.Fragmentmanager 主要用于在Activity中操作Fragment
android.app.FragmenTransaction 保证一些列Fragment操作的原子性。
接下来我们来使用Transaction来进行对Fragment的管理;
Transaction的基本功能
transaction.add();//往Activity中添加一个Fragment
transaction.remove();//从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈
这个Fragment实例将被销毁。
transaction.replace();//使用另一个Fragment替换当前的,实际上就是remove然后在add
transaction.hide();//隐藏当前的Fragment,仅仅是设为不可见,并没有销毁。
transaction.show();//显示之前隐藏的Fragment
detach();//会将view从ui中移除,和remove()不同,此时fragment的状态依然有FragemntManager维护
attach();//重新view视图,附加到UI上并显示。
transaction.commit();//提交事务
transaction.addtoBackStack(NULL);//有回退功能
这里为了更直观点我们重写一个Activity
实现用按钮替换Fragment的功能;
首先是两个fragment 布局:fragment1,fragment2
两个都只放一个图片
之后实现fragment的类,fragment1,fragment2
public class fragment1 extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=LayoutInflater.from(getActivity()).inflate(R.layout.fragment1,container,false);
return view;
}
}
public class fragment2 extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=LayoutInflater.from(getActivity()).inflate(R.layout.fragment2,container,false);
return view;
}
}
之后就是MainActivity里的定义了:
默认是fragment1的类显示;
MainActivity函数
public class Main1Activity extends AppCompatActivity {
private ImageView I1;
private ImageView I2;
@Override
protected void onCreate(Bundle savedInstanceState) {
Onclick onclick=new Onclick();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main1);
I1=(ImageView)findViewById((R.id.imageView3));
I2=(ImageView)findViewById(R.id.imageView4);
I1.setOnClickListener(onclick);
I2.setOnClickListener(onclick);
}
public class Onclick implements View.OnClickListener{
@Override
public void onClick(View v) {
FragmentManager manager=getSupportFragmentManager();//定义manager
FragmentTransaction fm=manager.beginTransaction();调用manager的.beginTransaction()方法 定义
Fragment fam=null;//Fragment类 声明
switch (v.getId()){
case R.id.imageView3:
fam=new fragment1();
break;
case R.id.imageView4:
fam=new fragment2();
break;
default:
break;
}
fm.replace(R.id.fragmentt,fam);//用transaction来替换组件中的fragment,第一参数是容器,第二个参数是定义的fragment类
fm.commit();
//也可以实现诸如 fm.hide(f1);
// fm.show(f2);
//或 fm.remove(f1);
// fm.add(f2);
//fm.addtoBack(Null);一般移除后都来赋予个回退功能,视情况而定
}
}
}
建议再去看看Transaction add时的注意事项,这篇文章挺好的
添加链接描述