Fragment

作者: Tuttonero | 来源:发表于2016-10-04 17:14 被阅读0次

Fragment的介绍

Fragment可以当成Activity的一个界面的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成,更帅气的是Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了,并且占用内存降低,性能大幅度提高。更为重要的是,你可以动态的添加、替换和移除某个Fragment。

Fragment的生命周期

  1. onAttach()当该Fragment被添加到Activity时被回调。该方法只会被调用一次。
  2. onCreate()创建Fragment时被回调。该方法只会被回调一次
  3. onCreateView()每次创建、绘制该Fragment的View组件时回调该方法,Fragment会显示该方法返回的View对象
  4. onActivityCreated() 当Fragment所在的Activity被启动完成后回调该方法。当Activity的onCreate()方法返回之后调用该方法。
  5. onStart()启动Fragment时被回调
  6. onResume()恢复Fragment时回调该方法,在onStart()方法后一定会回调该方法。
  7. onPause() 暂停Fragment时回调该方法
  8. onStop() 停止Fragment时被回调
  9. onDestroyView() 销毁该Fragment所包含的View组件时调用
  10. onDestroy() 销毁Fragment时被回调
  11. onDetach() 将该Fragment从Activity中删除、替换完成时回调该方法,在onDestroy()方法后一定会回调onDetach()方法。该方法只会被回调一次。

Fragment的使用

1.静态使用

首先创建两个XML文件,fragment1.xml和fragment2.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    android:layout_width="match_parent"    
    android:layout_height="match_parent"    
    android:background="#00ff00" >    
    
    <TextView    
        android:layout_width="wrap_content"    
        android:layout_height="wrap_content"    
        android:text="碎片1"    
        android:textColor="#000000"    
        android:textSize="25sp" />    
    
</LinearLayout>    
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:background="#ffff00" >  
  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="碎片2"  
        android:textColor="#000000"  
        android:textSize="25sp" />  
  
</LinearLayout>  

然后创建两个两个类,Fragment1和Fragment2分别继承Fragment,注意,使用的V4包中的Fragment!

public class Fragment1 extends Fragment {  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
        return inflater.inflate(R.layout.fragment1, container, false);  
    }  
}  
public class Fragment2 extends Fragment {  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
        return inflater.inflate(R.layout.fragment2, container, false);  
    }  
}  

最后在activity_main.xml里面使用两个fragment

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent">  
  
    <fragment  
        android:id="@+id/fragment1"  
        android:name="yin.layout.Fragment1"  
        android:layout_width="0dp"  
        android:layout_height="match_parent"  
        android:layout_weight="1" />  
  
    <fragment  
        android:id="@+id/fragment2"  
        android:name="yin.layout.Fragment2"  
        android:layout_width="0dp"  
        android:layout_height="match_parent"  
        android:layout_weight="1" />  
  
</LinearLayout>  

2.动态使用

首先在activity_main.xml里面的布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical">  
  
    <Button  
        android:id="@+id/btn_show_fragment1"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:text="显示Fragment1"/>  
  
    <Button  
        android:id="@+id/btn_show_fragment2"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:text="显示Fragment2"/>  
  
    <FrameLayout  
        android:id="@+id/fragment_container"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"/>  
  
</LinearLayout>  

然后还是创建2个fragment,可以使用快速创建



最后是在MainActivity里使用代码进行动态添加

public class MainActivity extends FragmentActivity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        Button btnLoadFrag1 = (Button)findViewById(R.id.btn_show_fragment1);  
        btnLoadFrag1.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                FragmentManager manager = getSupportFragmentManager();  
                FragmentTransaction transaction = manager.beginTransaction();  
                Fragment1 fragment1 = new Fragment1();  
                transaction.add(R.id.fragment_container, fragment1);  
                transaction.commit();  
            }  
        });  
  
        Button btnLoagFrag2 = (Button)findViewById(R.id.btn_show_fragment2);  
        btnLoagFrag2.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                FragmentManager manager = getSupportFragmentManager();  
                FragmentTransaction transaction = manager.beginTransaction();  
                Fragment2 fragment2 = new Fragment2();  
                transaction.add(R.id.fragment_container, fragment2);  
                transaction.commit();  
            }  
        });  
    }  
}  

其实动态添加最主要的就是这几个步奏(注意! transaction不要复用!!!)

FragmentManager manager = getSupportFragmentManager();  
FragmentTransaction transaction = manager.beginTransaction();  
Fragment1 fragment1 = new Fragment1();  
transaction.add(R.id.fragment_container, fragment);  //添加
transaction.show(R.id.fragment_container, fragment);  //显示
transaction.hide(R.id.fragment_container, fragment);  //隐藏
transaction.replace(R.id.fragment_container, fragment);  //替换
transaction.remove(R.id.fragment_container, fragment);  //移除
transaction.commit();  

Fragment的传参

敬请期待

相关文章

网友评论

      本文标题:Fragment

      本文链接:https://www.haomeiwen.com/subject/ertsyttx.html