fragment+viewpager學習二(fragment間的跳轉) 更新中

Fragment越來越多的被開發者使用,估計即將成爲一種趨勢。最近被很多人問關於fragment的跳轉問題,再加上本人也研究了很多fragment的用法,看了關於fragment的大部分API,特在此說下本人的菜鳥看法

實現一:簡單的從一個fragment中跳轉到另一個fragment,按返回鍵返回上一個fragment

1、實現效果圖


項目結構圖


MainActivity.java

package com.xwj.fragmenttest1;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;

public class MainActivity extends FragmentActivity {

	private FragmentManager fragmentManager;
	private FragmentTransaction fragmentTransaction;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		fragmentManager = getSupportFragmentManager();
		fragmentTransaction = fragmentManager.beginTransaction();

		FragmentTest1 fragmentTest1 = new FragmentTest1();

		fragmentTransaction.replace(R.id.fragment_main, fragmentTest1,
				"fragmentTest1");

		fragmentTransaction.commit();
	}

	@Override
	public void onBackPressed() {
		if (fragmentManager.findFragmentByTag("fragmentTest1") != null
				&& fragmentManager.findFragmentByTag("fragmentTest1")
						.isVisible()) {
			System.out.println("12");
			MainActivity.this.finish();
		} else {
			super.onBackPressed();
		}

	}

}

注:FragmentActivity的FragmentManager是處理Fragment Transaction的而不是處理Fragment

FragmentTransaction默認並不會主動被加入到BackStack中,需要調用addToBackStack(String tag)方法。參數'fragmentTest1'作爲本次加入BackStack的Transaction的標誌

和addToBackStack相對應的接口方法是popBackStack()和popBackStackImmediate()


FragmentTest1.java

package com.xwj.fragmenttest1;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;

public class FragmentTest1 extends android.support.v4.app.Fragment {

	private static final String TAG = "FragmentTest1---------";

	@Override
	public void onCreate(Bundle savedInstanceState) {
		System.out.println(TAG + "onCreate");
		super.onCreate(savedInstanceState);
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		System.out.println(TAG + "onCreateView");
		View view = inflater.inflate(R.layout.test1_fragment, null);
		Button jumpBtn = (Button) view.findViewById(R.id.btn_jump);
		jumpBtn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				getActivity()
						.getSupportFragmentManager()
						.beginTransaction()
						.replace(R.id.fragment_main, new Fragmenttest2(),
								"Fragmenttest2")
						.addToBackStack("Fragmenttest2").commit();

			}
		});
		return view;

	}

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		System.out.println(TAG + "onActivityCreated");
		super.onActivityCreated(savedInstanceState);

	}

	@Override
	public void onAttach(Activity activity) {
		System.out.println(TAG + "onAttach");
		super.onAttach(activity);
	}

	@Override
	public void onDestroy() {
		System.out.println(TAG + "onDestroy");
		super.onDestroy();
	}

	@Override
	public void onDestroyView() {
		System.out.println(TAG + "onDestroyView");
		super.onDestroyView();
	}

	@Override
	public void onPause() {
		System.out.println(TAG + "onPause");
		super.onPause();
	}

	@Override
	public void onResume() {
		System.out.println(TAG + "onResume");
		super.onResume();
	}

	@Override
	public void onStart() {
		System.out.println(TAG + "onStart");
		super.onStart();
	}

	@Override
	public void onStop() {
		System.out.println(TAG + "onStop");
		super.onStop();
	}

	@Override
	public void onDetach() {
		System.out.println(TAG + "onDetach");
		super.onDetach();
	}

}


Fragmenttest1中的
.addToBackStack("Fragmenttest2")
記得一定要添加,這是進棧,方便你從Fragmenttest2中返回時不至於退出程序

至於Fragmenttest2只是簡單的界面,在此就不貼出來了

源碼下載:點擊


下面舉例說明Transaction BackStack的進棧和出棧

如下圖,使用FragmentActivity的FragmentManager創建Trasaction1並提交,使頁面顯示AFragment。這時調用popBackStack()就會移除AFragment並返回FragmentActivity。


[java] view plaincopy
  1. @Override  
  2. public void addFragment(BaseFragment baseFragment) {        
  3.     FragmentTransaction ft = getSupportFragmentManager().beginTransaction();  
  4.     ft.replace(R.id.home_frame_layout_for_fragments, baseFragment, baseFragment.getTagText());  
  5.     ft.addToBackStack(baseFragment.getTagText());  
  6.     ft.commit();  
  7. }  

在AFragment已經在棧頂的情況下,我們再創建Transation2並提交,Transaction 2添加了兩個Fragment,提交後頁面顯示的是CFragment,這時調用popBackStack()就會將Transaction2從BackStack移除,即將CFragment和BFragment同時移除,頁面將顯示AFragment。


[java] view plaincopy
  1. @Override  
  2. public void addMultipleFragments(BaseFragment[] baseFragments) {  
  3.     FragmentTransaction ft = getSupportFragmentManager().beginTransaction();  
  4.           
  5.     for(int i = 0 ; i < baseFragments.length ; i++) {  
  6.         ft.replace(R.id.home_frame_layout_for_fragments, baseFragments[i], baseFragments[i].getTagText());  
  7.     }     
  8.     ft.addToBackStack(baseFragments[0].getTagText());  
  9.     ft.commit();  
  10. }  


參考資料:







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章