一直以來大概做帶有導航類的應用的時候,都是使用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下載:
底部導航加頂部導航,使用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