您的位置:首页 > 移动开发 > Android开发

安卓学习之—Fragment

2016-07-02 19:13 197 查看
Fragment 基础

有点类似于Activity,有自己的布局,有自己的生命周期,可以处理用户事件,由于Fragment与Activity具有相似性,而且能在Activity中进行灵活切换,现在fragment大量的应用在手机平板间。

Fragment 版本

由于Fragment是在 3.0后才有的,要使用 Fragment SDK版本需要大于
11;由于Fragment的广泛使用,google后期在V4包中提供了
Fragment的支持.在实际开发过程中,V4包中Fragment得到广泛使用


Fragment 的创建

1.      新建Class继承 android.app.Fragment(sdk
>= 11)或 android.support.v4.app.Fragment(通用,建议使用)
2.      重写 onCreateView 方法:

3.   @Override
4.   public View onCreateView(LayoutInflaterinflater, ViewGroup container,
5.       Bundle savedInstanceState) {
6.       /**
7.        *为此fragment
加载你定义的布局文件
8.       */
9.       returninflater.inflate(R.layout.your_fragment_layout, container, false);
10.  }

注意: inflater.inflate(R.layout.your_fragment_layout,container, false); 中的参数必须为
false.

Fragment 的生命周期

1.     
onAttach()


fragment 与宿主Activity关联时调用。

2.     
onCreate()


在创建fragment时系统会调用此方法。

3.     
onCreateView()


fragment 的视图挂载到到宿主Activity的视图上时调用。

4.     
onActivityCreated()


宿主Activity
的onCreate()方法执行完成返回后调用。

5.     
onStart()


当 fragment
相对于用户而言,往可见方向的过程中,此时用户可见但不可操作时调用。

6.     
onResume()


当 fragment
相对于用户而言,往可见方向的过程中,此时用户可见也可操作时调用。

7.     
onPause()


当 fragment
相对于用户而言,往不可见方向的过程中,此时用户可见但不可操作时调用。

8.     
onStop()


当 fragment
相对于用户而言,往不可见方向的过程中,此时用户不可见也不可操作时调用。

9.     
onDestroyView()


fragment 的视图从到宿主Activity的视图中移除时调用。

10.    
onDestroy()


fragment 销毁时调用。

11.    
onDetach()


fragment 与宿主Activity解除关联时调用。

Fragment 和Activity间的关系

·        与 Activity类似,Fragment的设计是用来提供用户交互接口的;

·        但是Fragment不能单独存在,必须寄宿在Activity中;

·        一个Activity实例中可以寄宿多个Fragment实例;

·        一个Fragment实例只能有一个
Activity实例作为宿主;

·        Activity通过 FragmentManager来管理Fragment;

Fragment 的加载方式

XML配置加载(fragment的类型必须指定,因此通用性,灵活性不强。)

·        配置的步骤

1.     创建 Activity

MainActivity.java

``` public class MainActivity extendsFragmentActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

}


} ```

2.     创建 Fragment

LeftFragment.java

public class LeftFragment extends Fragment { @Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,BundlesavedInstanceState) { /** * Inflate the layout for this fragment */ returninflater.inflate(R.layout.left_fragment,
container, false); } }
RightFragment.java

public class RightFragment extends Fragment { @Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){ /** * Inflate the layout for this fragment */ returninflater.inflate(R.layout.right_fragment,
container, false); } }


3.     创建 Fragment的XML布局

<fragment
        android:id="@+id/fragment_my"
       android:layout_width="match_parent"
        android:layout_height="match_parent"
      class="com.example.fragmentwithxml.MyFragment"/>

动态加载

[b]FragmentManager[/b]
·        作用

将Fragment
添加到Activity的视图中来,或是从Activity中移除。

·        如何拿到FragmentMannager

由 FragmentManager的作用可以了解到,FragmentManager是
Activity的一个工具,用来添加和移除 Fragment的工具,因此 FragmentManager
是在Activity中用的,也是在Activity中获得的。

SDK >= 11

FragmentManager fm = getFragmentManager();


通用V4包:(Activity必须继承 FragmentActivity)

FragmentManager fm = getSupportFragmentManager();


 

Fragment 的常用方法

// 得到Fragment管理者

FragmentManager fragmentManager =getSupportFragmentManager();

// 开启事物

FragmentTransaction transaction =fragmentManager.beginTransaction();

//参数1和参数2 :指的是你切换的时候的,进入和退出的动画

//参数3和参数4  :指的是按返回键的时候的进入的退出的动画

transaction.setCustomAnimations(R.anim.next_enter,R.anim.next_exit, R.anim.pre_enter, R.anim.pre_exit);(动画在添加和替换Fragment之前设置)

// Add操作,每次都会让容器中添加一个新的Fragment对象

tx.add(R.id.left_container, newMyFragment()); //添加一个Fragment(在一个事物里,相同对象只能添加一次)

// int : 要装替换的Fragment对象的容器的id

// Fragment : 要替换的Fragment对象

// replace操作:替换操作,在装入要替换的Fragment之前会吧之前的Fragment清除

tx.replace(R.id.right_container, newMyFragment());

add:加入的Fragment会长期驻于内存中,消耗内存,但数据如果无需改变且界面经常使用,推荐使用此方式

replace:加入的Fragment会替换之前的Fragment,不占用内存,如果数据经常改变,推荐使用此种方式

 

Fragment fragmentA = new FragmentA();

fragmentA.isAdded()//判断 fragmentA是否已经添加过

fragmentA.isVisible() //判断fargmentA是否是显示

transaction.show(fragmentA); //显示一个fragment

transaction.hide(fragmentA); //隐藏一个Fragment

transaction.addToBackStack(null);//将事物添加到回退栈,按返回键是fragment也要一个个返回

transaction.commit();//提交事物,一个事物只能提交一次;

 

Fragment 的通信

1,Activity与Fragment通信

MyFragment myFragment = new MyFragment();

Bundle args=new Bundle();

args.putString("msg", "
这是
activity
给你的
");

//
核心代码
:
Fragment
身上设置一个参数

myFragment.setArguments(args);

Fragment
:
将数据取出

Bundle arguments = getArguments();

String msg = arguments.getString("msg");


2,Fragment与Activity通信

//
获取与当前
Fragment
绑定的
Activity
的引用
,
强转为绑定
的
Activity,
调用方法
,
实现传值
,
类似回调的方式

MainActivity activity = (MainActivity) getActivity();

activity.receiveMsg("
这是
fragment
给你的
");



3,Fragment与Fragment进行通信

官方建议用接口回调

Envent Bus框架使用(导入jar包)

1.第一步写一个类创造一条总线对象
public
class
BusFactory {
   //创造一条总线对象
   private
static
Bus bus=new Bus();
   private BusFactory(){
     
   }
   public
static
  Bus getBus(){
      return
bus;
   }
}

2.注册总线

BusFactory.getBus().register(this);

3.接到消息的回调方法

@Subscribe 
//编写当接到消息后,用于处理消息的方法,标识必须写,方法可以自定义
   public
void
receiveMsg(Object data){
      //获取到MainActivity传过来的数据,并显示
      if (isChange) {
        isChange=false;
        return;
      }
      et.setText(data.toString());
   }

4.发送消息

BusFactory.getBus().post(data);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android Fragment