Fragment的使用与学习及使用过程中遇到的问题

一直以来大概做带有导航类的应用的时候,都是使用TabActivity,但是,最新的SDK把TabActivity标成了deprecated,那只能重新寻找替代方案了,目前网上说的方案都是很混乱的

Fragment翻译过来叫碎片,但是我个人觉得可以理解为具有生命周期的View

由于Fragment是3.0以后的东西,对于适应低版本,那我们只能使用谷歌官方提供的android-support-v4.jar这个包了,最快捷的办法就是右击工程名,选择Android Tools——add support library...,即可添加这个包了

由于3.0以下的Activity里面没有对Fragment的支持,所以选择继承android-support-v4.jar包中的FragmentActivity,其功能跟3.0及以后的版本的Activity的功能一样

 DEMO下载:

FragmentTest.zip

底部导航加顶部导航,使用FragmentTabHost,Fragmetn,FragmentActivity组成,代码已经打包上传了

1、首先,底部导航的实现,FragmentTabHost和以前的TabHost的区别就是增加了对Fragment的支持,这里的实现和其他使用TabActivity是一样的,只是选项卡的切换已经从activity变成fragment了

2、这里主要讲一下顶部导航的实现,为了让大家对fragment更好的理解,这里我没有采用FragmentTabHost,而是放了三个Button

 

?
package  com.yyb.fragmenttest;
 
import  android.os.Bundle;
import  android.support.v4.app.FragmentTabHost;
import  android.support.v4.app.FragmentTransaction;
import  android.view.LayoutInflater;
import  android.view.View;
import  android.view.ViewGroup;
import  android.view.View.OnClickListener;
 
public  class  Fragment1 extends  BaseFragment implements  OnClickListener{
 
     public  static  BaseFragment newInstance( int  index) {
         BaseFragment fragment = new  Fragment1();
         Bundle args = new  Bundle();
         args.putInt( "index" , index);
         fragment.setArguments(args);
         fragment.setIndex(index);
         return  fragment;
     }
 
     private  View layoutView;
     private  FragmentTabHost mTabHost;
 
     @Override
     public  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
     }
 
     @Override
     public  View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
 
         layoutView = inflater.inflate(R.layout.fragment_tabs, null );
         
         layoutView.findViewById(R.id.button1).setOnClickListener( this );
         layoutView.findViewById(R.id.button1).setSelected( true );
         layoutView.findViewById(R.id.button2).setOnClickListener( this );
         layoutView.findViewById(R.id.button3).setOnClickListener( this );
 
         if (savedInstanceState == null ){
             BaseFragment fragment = (BaseFragment)getChildFragmentManager().findFragmentByTag( 0 + "" ); // getActivity().getSupportFragmentManager().findFragmentByTag(index+"");
             if (fragment== null ){
                 init( 0 );
             }
         }
         
         return  layoutView;
     }
     
     private  void  init( int  index) {
         FragmentTransaction ft = getChildFragmentManager().beginTransaction();
         ft.add(R.id.realtabcontent, Fragment11.newInstance(index) ,index+ "" ); //将得到的fragment 替换当前的viewGroup内容,add则不替换会依次累加
         ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); //设置动画效果
         ft.commit(); //提交
     }
 
     @Override
     public  void  onClick(View v) {
         
         allNoSelect();
         
         switch  (v.getId()) {
         case  R.id.button1:
             placeView( 0 );
             break ;
         case  R.id.button2:
             placeView( 1 );
             break ;
         case  R.id.button3:
             placeView( 2 );
             break ;
         default :
             break ;
         }
         
         v.setSelected( true );
     }
 
     private  void  allNoSelect() {
         layoutView.findViewById(R.id.button1).setSelected( false );
         layoutView.findViewById(R.id.button2).setSelected( false );
         layoutView.findViewById(R.id.button3).setSelected( false );
     }
 
     public  void  placeView( int  index){
         BaseFragment fragment = (BaseFragment)<span style= "color: #ff0000;" >getChildFragmentManager()</span>.findFragmentByTag(index+ "" ); // getActivity().getSupportFragmentManager().findFragmentByTag(index+"");
         //得到一个fragment 事务(类似sqlite的操作)
         FragmentTransaction ft = getChildFragmentManager().beginTransaction();
         if  (fragment == null  ) {
             switch  (index) {
             case  0 :
                 fragment = Fragment11.newInstance(index);
                 return ;
             case  1 :
                 fragment = Fragment11.newInstance(index);
                 break ;
             case  2 :
                 fragment = Fragment11.newInstance(index);
                 break ;
             default :
 
                 return ;
             }
 
         }
         ft.replace(R.id.realtabcontent, fragment,index+ "" ); //将得到的fragment 替换当前的viewGroup内容,add则不替换会依次累加
         ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); //设置动画效果
         ft.addToBackStack( null );
         ft.commit(); //提交
 
     }
}

  这里有个FragmentTransaction(事务),这个是Fragment切换的核心类,它有两个方法:replace,add,一个是替换Fragment,一个是添加Fragment,两者的区别是:replace=remove掉旧fragment,add新的fragment

FragmentManager(碎片管理器),用来管理当前Activity中所有的Fragment

每次替换或者添加后,都要commit一样,才能算一个完整的事务,这里用了Fragment嵌套,还要注意一个问题,由于我当时没注意,导致想了好久才找出问题的原因所在,如果你是嵌套了Fragment,那么使用FragmentManager的一定要注意你当前的Fragment是属于嵌套的fragment还是顶层的Fragment,如果是顶层Fragment,那么你调用FragmentManager的时候,应该这样写getActivity().getSupportFragmentManager(),如果是嵌套的fragment那么应该这样写getChildFragmentManager()

 Fragment基础:http://www.cnblogs.com/TerryBlog/archive/2012/02/17/2355753.html

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值