Android fragment的基本使用

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时的注意事项,这篇文章挺好的
添加链接描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值