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)getChildFragmentManager().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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM