欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于Fragment学习小结

程序员文章站 2024-03-19 23:06:22
...

一、前期问题

我想要实现类似微信底部标签的切换功能(如下图),在之前没接触fragment的时候,第一的想法是在activity之间互相跳转,但是这样不仅会使底部标签这一部分的代码重复,而且增加开销,所以在这里使用fragment是很合适的。关于Fragment学习小结

二、fragment和Activity的关系

fragment代表activity工作,他的状态应该反映activity的状态。fragment的生命周期是由activity托管而不是操作系统调用。
fragment的完整生命周期如下:
onAttach→onCreate→onCreateView→onStart→onResume(可见状态)
→onPause→onStop→onDestory→onDetach

三、fragment的使用

  1. 在activity的布局文件中为fragment安排位置(activity_main.xml)
<!--这里相当于我把整一个屏幕托管给了fragment-->
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_frag"    <!--命名为了fragment能够找到其布局-->
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white">

</RelativeLayout>
  1. 新建fragment的布局xml文件(fragment_test.xml)
<!--简单的在布局里加了一个TextView-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">

    <TextView
        android:id="@+id/hello_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@color/black"
        android:text="hello_world"/>

</RelativeLayout>
  1. 创建Fragment类,加载Fragment布局(testFragment.java)
public class testFragment extends Fragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //加载fragment的布局
        View view = inflater.inflate(R.layout.fragment_test, container, false);
        /* 
        加载控件以及实现逻辑功能都在onCreateView()中实现,而不是onCreate();
        */
       return view;
    }
}
  1. 将fragment添加到activity中
public class FrontPage extends FragmentActivity {
    private Fragment fragment;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment_front);

        /*fragment注册*/
        //FragmentManger管理着fragment事务的回退栈
        FragmentManager fm = getSupportFragmentManager(); 
        //加载其在activity布局中的位置
        fragment = fm.findFragmentById(R.id.activity_frag);

        fm.beginTransaction().    //beginTransaction()返回FragmentTransaction实例
            add(R.id.page_content, firstPage).      //向队列中添加fragment
            commit();                               //最后提交

}

四、fragment的切换方法(介绍两种)

1、此方法原fragment依旧会保持resume状态
fragmentManager.beginTransaction().hide(fragment1).show(fragment2).commit();

2、 此方法下原fragment会被销毁

Fragment fragment = new Fragment2();
//获取Fragment事务实例
FragmentTransaction transaction = getFragmentManager().beginTransaction();
//用replace方式替换,
transaction.replace(R.id.page_content,fragment);

五、例子

git例子链接

小结

参考《android编程权威指南》以及自己在实际运用时的感悟写下此记录,如有错误欢迎指正

上一篇: 2020年5月 11周第三题

下一篇: