前言
fragment 可認為是一個輕量級的Activity,但不同與Activity,它是要嵌到Activity中來使用的,它用來解決設備屏幕大小的不同,主要是充分利用界面上的空間,如平板上多余的空間。一個Activity可以插入多個Fragment,可以認為Fragment就是Activity上的一個View。
本文主要介紹了關于Android中Fragment的基本用法,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
一、fragment管理
在activity動態加載fragment
加載fragment的布局不限,并不局限于FrameLayout
加載方法:(只有導入的fragment是v4包,才有getSupportFragmentManager())
1
2
3
4
5
|
FragmentA fragment = new FragmentA(); getSupportFragmentManager().beginTransaction() .add(R.id.XXX, fragment, "fragment" ) // .addToBackStack("") //加入回退棧 .commit; |
或者
1
2
3
4
|
FragmentManager manager = getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.add(R.id.fragment_container, fragment, "fragment" ); transaction.commit(); |
但是第二種方法要注意,導包須一致
1
2
|
import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; |
而除了使用add方法,我們也可以使用replace方法添加fragment
1
2
3
4
|
FragmentA fragment = new FragmentA(); getSupportFragmentManager().beginTransaction() .replace(R.id.XXX, fragment, "fragment" ) .commit(); |
add和replace的區別是:
①add 是往container容器里堆加fragment View;replace是將container容器里之前添加的View全部清除,然后再添加當前fragment View
一定要記住,replace清除的是container的視圖,而不是fragment實例, remove移除的才是fragment實例
②add后期可以使用show,hide操作,但是replace不可以,原因見①
③使用add,回滾時,fragment不會重新加載,曾經的操作痕跡還存在,使用replace回滾時,之前的fragment會重新加載,原因見①
使用add的時候還有一點需要注意的是,視圖重疊的問題,記得設置背景色
add 和 replace 千萬不要混合使用,否則會出錯
在進行remove,hide,show之前要記得判斷fragment.isAdded();下
面的代碼我就不提示了
移除fragment實例
1
2
3
4
|
Fragment fragment = getSupportFragmentManager().findFragmentByTag( "fragment" ); getSupportFragmentManager().beginTransaction() .remove(fragment) .commit(); |
隱藏fragment
1
2
3
4
|
Fragment fragment = getSupportFragmentManager().findFragmentByTag( "fragment" ); getSupportFragmentManager().beginTransaction() .hide(fragment) .commit(); |
顯示fragment
1
2
3
4
|
Fragment fragment = getSupportFragmentManager().findFragmentByTag( "fragment" ); getSupportFragmentManager().beginTransaction() .show(fragment) .commit(); |
拓展:
在fragment里刷新(即從頭加載fragment數據,且不影響后續的回退棧)
1
2
3
4
5
|
Fragment replaceFragment = getActivity().getSupportFragmentManager().findFragmentByTag( "first_fragment" ); getActivity().getSupportFragmentManager().beginTransaction() .detach(replaceFragment) .attach(replaceFragment) .commit(); |
簡單的講,detach是銷毀View,而不是fragment實例,attach是重建視圖View,attach后的視圖會位于視圖最前面,具體的可以自己去查看資料
二、回滾操作
最常用:依次回滾
1
2
3
4
5
6
7
8
|
@Override public void onBackPressed() { if (getSupportFragmentManager().getBackStackEntryCount() <= 1 ) { //這里是取出我們返回棧存在Fragment的個數 finish(); } else { //取出我們返回棧保存的Fragment,這里會從棧頂開始彈棧 getSupportFragmentManager().popBackStack(); } } |
拓展:指定回滾
1
|
void popBackStack(String name, int flags); |
參數string name是transaction.addToBackStack(String tag)
中的tag值;
至于int flags有兩個取值:0或FragmentManager.POP_BACK_STACK_INCLUSIVE
;
當取值0時,表示除了參數一指定這一層之上的所有層都退出棧,指定的這一層為棧頂層;
當取值POP_BACK_STACK_INCLUSIVE時,表示連著參數一指定的這一層一起退出棧;
退回棧頂:
1
2
3
|
while (getSupportFragmentManager().getBackStackEntryCount()> 1 ) { getSupportFragmentManager().popBackStackImmediate(); } |
三、重點來了,在fragment里面加載fragment 顯示問題
1.顯示不出來:
加載fragment的布局不要使用LinearLayout,不要使用LinearLayout,不要使用LinearLayout,重要的事情說三遍,否則很有可能加載的fragment顯示不出來
2.顯示不完全:在onCreateView使用方式一,不要使用方式二
1
2
3
4
5
6
7
8
9
|
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 方式一 View view = inflater.inflate(R.layout.XXX, container, false ); // 方式二 // View view = inflater.inflate(R.layout.XXX, null); return view; } |
3.點擊事件透傳
①如果加載的fragment的布局為ScrollView,不會發生透傳事件
②如果存在透傳事件,在fragment的根布局加上android:clickable="true"
,即可簡單粗暴的解決點擊事件穿透的問題
4.獲取回退棧中fragment的數量
方式一:activity如繼承FragmentActivity,可通過getSupportFragmentManager().getBackStackEntryCount()
判斷activity中棧內已存的fragment的數量,不包括通過方式二加載進去的fragment(在fragment中加載子fragment)
方式二:此方式是在fragment中通過getChildFragmentManager().getBackStackEntryCount()
判斷此fragment棧內已存的fragment的數量
1
2
3
4
|
getChildFragmentManager().beginTransaction() .replace(R.id.XXX, fragment) .addToBackStack( null ) .commit(); |
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://www.androidchina.net/8365.html