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();
}
}
.addToBackStack("Fragmenttest2")
記得一定要添加,這是進棧,方便你從Fragmenttest2中返回時不至於退出程序至於Fragmenttest2只是簡單的界面,在此就不貼出來了
源碼下載:點擊
下面舉例說明Transaction BackStack的進棧和出棧
如下圖,使用FragmentActivity的FragmentManager創建Trasaction1並提交,使頁面顯示AFragment。這時調用popBackStack()就會移除AFragment並返回FragmentActivity。
- @Override
- public void addFragment(BaseFragment baseFragment) {
- FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
- ft.replace(R.id.home_frame_layout_for_fragments, baseFragment, baseFragment.getTagText());
- ft.addToBackStack(baseFragment.getTagText());
- ft.commit();
- }
在AFragment已經在棧頂的情況下,我們再創建Transation2並提交,Transaction 2添加了兩個Fragment,提交後頁面顯示的是CFragment,這時調用popBackStack()就會將Transaction2從BackStack移除,即將CFragment和BFragment同時移除,頁面將顯示AFragment。
- @Override
- public void addMultipleFragments(BaseFragment[] baseFragments) {
- FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
- for(int i = 0 ; i < baseFragments.length ; i++) {
- ft.replace(R.id.home_frame_layout_for_fragments, baseFragments[i], baseFragments[i].getTagText());
- }
- ft.addToBackStack(baseFragments[0].getTagText());
- ft.commit();
- }
參考資料: