Fragment 的两种创建方式

一、fragment的静态创建步骤:(前提:写好自己的Fragment类,见上篇文章)

在要用到fragment的Activity所对应的XML文件中添加fragment控件并为其添加name属性(android:name="包名.Fragment类名")和id属性(id不加的话会在程序运行时出现闪退)。

<!--name属性是静态引用Fragment类,
Layout属性是让布局立马显示在此布局上(layout属性可有可无)
id属性是必须要引用的,不加的话会报错-->
<fragment
    android:id="@+id/fragment_one"
    android:layout_width="100dp"
    android:layout_height="match_parent"
    android:name="com.zhiyuan3g.mybase3.FragmentOne"
    tools:layout="@layout/fragment_one"/>

代码如下:

MainActivity.class

[plain] view plain copy
  1. public class MainActivity extends AppCompatActivity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.     }  
  8. }  

activity_main.xml

[plain] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     xmlns:tools="http://schemas.android.com/tools"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="match_parent"  
  7.     android:orientation="horizontal"  
  8.     android:paddingBottom="@dimen/activity_vertical_margin"  
  9.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  10.     android:paddingRight="@dimen/activity_horizontal_margin"  
  11.     android:paddingTop="@dimen/activity_vertical_margin"  
  12.     tools:context="com.zhiyuan3g.fragmenttest.MainActivity">  
  13.   
  14.     <fragment  
  15.         android:name="com.zhiyuan3g.fragmenttest.Fragment1"  
  16.         android:id="@+id/fragment1"  
  17.         android:layout_width="0dp"  
  18.         android:layout_height="match_parent"  
  19.         android:layout_weight="1"/>  
  20.   
  21.     <fragment  
  22.         android:name="com.zhiyuan3g.fragmenttest.Fragment2"  
  23.         android:layout_width="0dp"  
  24.         android:id="@+id/fragment2"  
  25.         android:layout_height="match_parent"  
  26.         android:layout_weight="1"/>  
  27. </LinearLayout>  

Fragment1.class(同Fragment2.class)

[plain] view plain copy
  1. public class Fragment1 extends Fragment {  
  2.     @Nullable  
  3.     @Override  
  4.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  5.         View fragment1 = inflater.inflate(R.layout.fragment1, null);  
  6.         return fragment1;  
  7.     }  
  8. }  


运行效果:



二、Fragment的动态创建的步骤:(前提:写好自己的Fragment类,见上篇文章)
1.创建Fragment的管理对象fragmentManager。
FragmentManager fragmentManager = getFragmentManager();
2.创建事务对象(Fragment事务对象不能抽取,因为每提交一次,就需要一个新的Fragment事务对象.(所有的事务都有这个特性))
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
3.动态创建Fragment

fragmentTransaction.replace(android.R.id.content, new Fragment1());

4.提交事务对象

fragmentTransaction.commit();


主要逻辑代码如下:
//获取碎片管理者
mFragmentManager = getSupportFragmentManager();

//事务是不能共享的,每次用到都要重新开启一个事务,之后提交
FragmentTransaction fragmentTransactiontwo = mFragmentManager.beginTransaction();
//参数:1.父容器   2.要替换的fragmentfragmentTransactiontwo.replace(R.id.framelayout, mFragmentTwo);
//提交事务
fragmentTransactiontwo.commit();
   

注:但是,我们开发中使用动态创建一般不用上面的这种方法,因为这种方法每次切换fragment时都会重新初始化(使用replace方法的弊端),所以我们用隐藏和添加来实现代替replace。通过事物对象的add方法添加或show方法显示(如果已经被添加了),然后在跳转前将当前的fragment隐藏。这样我们就不用每次切换fragment都初始化了,节省流量和手机资源。

补充:碎片的回退实现方法,先通过事务对象的addToBackStack一个个放入栈中,再将通过popBackStack()从栈中拿出来,从而实现碎片回退功能。

主要逻辑代码如下:(注释很详细)

//获取碎片管理者
mFragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction1 = mFragmentManager.beginTransaction();
switch (v.getId()) {
    case R.id.frist:
        //判断fragmentOne是否已经存在
        if (mFragmentOne.isAdded()) {
            //如果fragmentOne已经存在,则隐藏当前的fragment            //然后显示fragmentOne(不会重新初始化,只是加载之前隐藏的fragment            fragmentTransaction1.hide(fragmentNow).show(mFragmentOne);
        } else {
            //如果fragmentOne不存在,则隐藏当前的fragment            //然后添加fragmentOne(此时是初始化)
            fragmentTransaction1.hide(fragmentNow).add(R.id.framelayout, mFragmentOne);
            fragmentTransaction1.addToBackStack(null);

        }
        //将加载的fragment赋给我们的中转量(用于记录屏幕当前显示的fragment        fragmentNow = mFragmentOne;
        fragmentTransaction1.commit();
        break;


下面是代码:
MainActivity.java

[plain] view plain copy
  1. package com.zhiyuan3g.mybase3;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.v4.app.Fragment;  
  5. import android.support.v4.app.FragmentManager;  
  6. import android.support.v4.app.FragmentTransaction;  
  7. import android.support.v7.app.AppCompatActivity;  
  8. import android.view.View;  
  9. import android.widget.Button;  
  10. import android.widget.FrameLayout;  
  11.   
  12. public class Main2Activity extends AppCompatActivity implements View.OnClickListener {  
  13.   
  14.     private Button frist;  
  15.     private Button two;  
  16.     private FragmentManager mFragmentManager;  
  17.     private FrameLayout framelayout;  
  18.     private Fragment mFragmentOne;  
  19.     private Fragment mFragmentTwo, fragmentNow;  
  20.     private Button back_btn;  
  21.   
  22.     @Override  
  23.     protected void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_main2);  
  26.         initView();  
  27.         initDefaultFragment();  
  28.   
  29.     }  
  30.   
  31.     //初始化默认fragment的加载  
  32.     private void initDefaultFragment() {  
  33.   
  34.         //开启一个事务  
  35.         FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();  
  36.         //add:往碎片集合中添加一个碎片;  
  37.         //replace:移除之前所有的碎片,替换新的碎片(remove和add的集合体)(很少用,不推荐,因为是重新加载,所以消耗流量)  
  38.         //参数:1.公共父容器的的id  2.fragment的碎片  
  39.         fragmentTransaction.add(R.id.framelayout, mFragmentOne);  
  40.         fragmentTransaction.addToBackStack(null);  
  41.   
  42.         //提交事务  
  43.         fragmentTransaction.commit();  
  44.         fragmentNow = mFragmentOne;  
  45.   
  46.     }  
  47.   
  48.     private void initView() {  
  49.         frist = (Button) findViewById(R.id.frist);  
  50.         two = (Button) findViewById(R.id.two);  
  51.   
  52.         frist.setOnClickListener(this);  
  53.         two.setOnClickListener(this);  
  54.         framelayout = (FrameLayout) findViewById(R.id.framelayout);  
  55.         //实例化FragmentOne  
  56.         mFragmentTwo = new FragmentTwo();  
  57.         mFragmentOne = new FragmentOne();  
  58.         //获取碎片管理者  
  59.         mFragmentManager = getSupportFragmentManager();  
  60.   
  61.         framelayout.setOnClickListener(this);  
  62.         back_btn = (Button) findViewById(R.id.back_btn);  
  63.         back_btn.setOnClickListener(this);  
  64.     }  
  65.   
  66.     //通过点击事件跳转到对应的fragment上  
  67.     @Override  
  68.     public void onClick(View v) {  
  69.         FragmentTransaction fragmentTransaction1 = mFragmentManager.beginTransaction();  
  70.         switch (v.getId()) {  
  71.             case R.id.frist:  
  72.                 //判断fragmentOne是否已经存在  
  73.                 if (mFragmentOne.isAdded()) {  
  74.                     //如果fragmentOne已经存在,则隐藏当前的fragment,  
  75.                     //然后显示fragmentOne(不会重新初始化,只是加载之前隐藏的fragment)  
  76.                     fragmentTransaction1.hide(fragmentNow).show(mFragmentOne);  
  77.                 } else {  
  78.                     //如果fragmentOne不存在,则隐藏当前的fragment,  
  79.                     //然后添加fragmentOne(此时是初始化)  
  80.                     fragmentTransaction1.hide(fragmentNow).add(R.id.framelayout, mFragmentOne);  
  81.                     fragmentTransaction1.addToBackStack(null);  
  82.   
  83.                 }  
  84.                 fragmentNow = mFragmentOne;  
  85.                 fragmentTransaction1.commit();  
  86.                 break;  
  87.             case R.id.two:  
  88.                 if (mFragmentTwo.isAdded()) {  
  89.                     fragmentTransaction1.hide(fragmentNow).show(mFragmentTwo);  
  90.                 } else {  
  91.                     fragmentTransaction1.hide(fragmentNow).add(R.id.framelayout, mFragmentTwo);  
  92.                     fragmentTransaction1.addToBackStack(null);  
  93.                 }  
  94.                 fragmentNow = mFragmentTwo;  
  95.                 fragmentTransaction1.commit();  
  96.                 break;  
  97.             case R.id.back_btn:  
  98.                 //在上面给事务对象添加addToBackStack(null),  
  99.                 //下面就可以通过碎片管理对象(mFragmentManager)调用popBackStack()方法来返回上一个碎片(此时碎片管理器只有两个碎片)  
  100.                 //因为我们是通过add的方法添加fragment的,而且只是添加的两次,其余都是显示和隐藏来实现  
  101.                 //又因为我们当前占了一个fragment,所以我们只能回退一次,第二次回退就会是空的fragment(什么都没有)  
  102.                 mFragmentManager.popBackStack();  
  103.                 break;  
  104.         }  
  105.     }  
  106. }  

FragmentOne.java

[plain] view plain copy
  1. package com.zhiyuan3g.mybase3;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.annotation.Nullable;  
  5. import android.support.v4.app.Fragment;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.Button;  
  10. import android.widget.Toast;  
  11.   
  12.   
  13. public class FragmentOne extends Fragment implements View.OnClickListener {  
  14.   
  15.     //相当于Activity的onCreate方法,用来初始化数据和视图  
  16.     @Nullable  
  17.     @Override  
  18.     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {  
  19.         //让碎片加载一个布局  
  20.         View view = inflater.inflate(R.layout.fragment_one, container, false);  
  21.         Toast.makeText(getContext(), "fragment初始化提示消息", Toast.LENGTH_SHORT).show();  
  22.         initView(view);  
  23.         return view;  
  24.     }  
  25.   
  26.     private void initView(View view) {  
  27.         Button button = (Button) view.findViewById(R.id.onclick_btn);  
  28.         button.setOnClickListener(this);  
  29.     }  
  30.   
  31.   
  32.   
  33.     @Override  
  34.     public void onClick(View v) {  
  35.          Toast.makeText(getContext(), "fragment内部button按钮提示", Toast.LENGTH_SHORT).show();  
  36.     }  
  37. }  


FragmentTwo.java

[plain] view plain copy
  1. package com.zhiyuan3g.mybase3;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.annotation.Nullable;  
  5. import android.support.v4.app.Fragment;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9.   
  10.   
  11. public class FragmentTwo extends Fragment {  
  12.     @Nullable  
  13.     @Override  
  14.     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {  
  15.         View view = inflater.inflate(R.layout.fragment_two, container, false);  
  16.         Toast.makeText(getContext(), "fragment初始化提示消息", Toast.LENGTH_SHORT).show();  
  17.         return view;  
  18.     }  
  19. }  

activity_main2.xml

[plain] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     xmlns:tools="http://schemas.android.com/tools"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="match_parent"  
  7.     android:paddingBottom="@dimen/activity_vertical_margin"  
  8.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  9.     android:paddingRight="@dimen/activity_horizontal_margin"  
  10.     android:paddingTop="@dimen/activity_vertical_margin"  
  11.     android:gravity="center_horizontal"  
  12.     tools:context="com.zhiyuan3g.mybase3.Main2Activity">  
  13.   
  14.     <Button  
  15.         android:layout_width="wrap_content"  
  16.         android:layout_height="wrap_content"  
  17.         android:id="@+id/frist"  
  18.         android:text="第一个Fragment"/>  
  19.     <Button  
  20.         android:layout_below="@+id/frist"  
  21.         android:layout_width="wrap_content"  
  22.         android:id="@+id/two"  
  23.         android:text="第二个Fragment"  
  24.         android:layout_height="wrap_content"/>  
  25.     <Button  
  26.         android:layout_width="wrap_content"  
  27.         android:layout_height="wrap_content"  
  28.         android:id="@+id/back_btn"  
  29.         android:text="返回"  
  30.         android:layout_below="@+id/two"  
  31.         />  
  32.     <FrameLayout  
  33.         android:layout_width="match_parent"  
  34.         android:id="@+id/framelayout"  
  35.         android:layout_height="match_parent"  
  36.         android:layout_below="@+id/back_btn">  
  37.   
  38.     </FrameLayout>  
  39.   
  40. </RelativeLayout>  

fragment_one.xml

[plain] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.               android:orientation="vertical"  
  4.               android:background="@android:color/holo_red_light"  
  5.               android:layout_width="match_parent"  
  6.               android:gravity="center_horizontal"  
  7.               android:layout_height="match_parent">  
  8.   
  9.     <Button  
  10.         android:id="@+id/onclick_btn"  
  11.         android:text="点击事件"  
  12.         android:onClick="btn"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"/>  
  15. </LinearLayout>  

fragment_two.xml

[plain] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.               android:orientation="vertical"  
  4.               android:layout_width="match_parent"  
  5.               android:background="#12ab34"  
  6.               android:layout_height="match_parent">  
  7.   
  8. </LinearLayout>  


效果图:     



完整Demo代码下载http://pan.baidu.com/s/1c2L3pwW
转载http://blog.csdn.net/lixiang_y/article/details/54889463
展开阅读全文

没有更多推荐了,返回首页