Android开发Android开发经验谈Android知识

Fragment详

2016-08-02  本文已影响0人  alsheng

一. Fragment简介


二. Fragment的生命周期

1350998205_2002.png
因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相关的。如果Activity是暂停状态,其中所有的Fragment都是暂停状态;如果Activity是stopped状态,这个Activity中所有的Fragment都不能被启动;如果Activity被销毁,那么它其中的所有Fragment都会被销毁。但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除Fragment。

1. Fragment的几种状态

Fragment和activity一样,也是有四种状态

2.Fragment和Activity的对比

(1)活动和碎片之间的对比图
2536652-a8cda6b9d53af55b.png
(2)由上图可以看出,Fragment比Activity多了几个额外的生命周期回调方法:

三.如何使用Fragment

  1. 继承Fragment,重写onCreateView决定Fragemnt的布局
  2. 在Activity中声明此Fragment,就当和普通的View一样
    关键代码:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(layout, container, false); }

FragmentManager fm = getFragmentManager();
// 开启Fragment事务
FragmentTransaction transaction = fm.beginTransaction();
//Fragment的布局替代控件
transaction.replace(控件的id, 碎片实例);
// 事务提交
transaction.commit();

transaction.addToBackStack(null);

注意: 在事务没有提交之前添加代码


四.Fragment的通信

Fragment和Activity之间的调用

为了方便碎片与活动之间进行通信,FragmentManager提供了一个类似于findViewById()的方法,专门从布局文件中获取碎片的实例,代码如下:

Fragment fragment=(Fragment)getFragmentManager()
.findFragmentById(R.id.fragment);

调用 FragmentManager 的 findFragmentById()方法,可以在活动中得到相应碎片的实例,这样就可以调用碎片的方法了。

在每个碎片中都可以通过调用 getActivity()方法来得到和当前碎片相关联 的活动实例,代码如下:

MainActivity activity=(MainActivity)getActivity();

获得活动实例后,就可以在碎片中调用活动的方法。另外当碎片中需要 使用 Context 对象时,也可以使用 getActivity()方法,因为获取到的活动本身就是一个Context对象了。

Fragment和Activity之间的通信

public class MainActivity extends FragmentActivity{ //声明一个Handler  public Handler mHandler = new Handler(){ 
@Override 
public void handleMessage(Message msg) { 
super.handleMessage(msg);
 ...相应的处理代码
 }
 }
 ...相应的处理代码 
}
 public class MainFragment extends Fragment{
 //保存Activity传递的handler
 private Handler mHandler; 
@Override
 public void onAttach(Activity activity) { 
super.onAttach(activity);
 //这个地方已经产生了耦合,若还有其他的activity,这个地方就得修改 
 if(activity instance MainActivity){ 
mHandler = ((MainActivity)activity).mHandler;
 }
 }
 ...相应的处理代码
 }

该方案存在的缺点:
Fragment对具体的Activity存在耦合,不利于Fragment复用
不利于维护,若想删除相应的Activity,Fragment也得改动
没法获取Activity的返回数据

public class AnyEventType {  
     public AnyEventType(){}  
 }  

(2)在要接收消息的页面注册:

eventBus.register(this);  

(3)发送消息

eventBus.post(new AnyEventType event);  

(4)接受消息的页面实现(共有四个函数,各功能不同,这是其中之一,可以选择性的实现,这里先实现一个):

public void onEvent(AnyEventType event) {}  

(5)解除注册

eventBus.unregister(this); 

注意:在EventBus中,获取实例的方法一般是采用EventBus.getInstance()来获取默认的EventBus实例,当然你也可以new一个实例。

 public class ExampleFragment extends Fragment{
 private String type; 
public static ExampleFragment newInstance(String type) { 
ExampleFragment myFragment = new ExampleFragment(); 
Bundle args = new Bundle(); 
args.putString("type", type);
//发送要传递的值
myFragment.setArguments(args);
return myFragment; 
} 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
//接收数据
type=getArguments().getString("type");
 ...相应的处理代码
 }
}

这种activity向fragment传值方法是最简单有效的,而且在fragment异常重建的时候bundle将参数保存了下来

//MainActivity 实现MainFragment的接口
public class MainActivity extends FragmentActivity implements FragmentListener{ 
@override
 public void toInterface (){ } ...其他处理代码省略 }
public class MainFragment extends Fragment{ 
public FragmentListener mListener;
 //MainFragment开放的接口 
public static interface FragmentListener{ 
void toInterface (); }
 @Override 
public void onAttach(Activity activity) {
 super.onAttach(activity); 
//对传递进来的Activity进行接口转换 
if(activity instance FragmentListener){ 
mListener = ((FragmentListener)activity);
 } } ...其他处理代码省略 }

这种方案应该是既能达到复用,又能达到很好的可维护性,并且性能很好(推荐使用)

上一篇 下一篇

猜你喜欢

热点阅读