Fragment的addToBackStatck和進出場動畫轮纫,F(xiàn)ragment間數(shù)據(jù)傳遞

Fragment表現(xiàn)Activity中用戶界面的一個行為或者是一部分。你可以在一個單獨的activity上把多個fragment組合成為一個多區(qū)域的UI焚鲜,并且可以在多個activity中再使用掌唾。你可以認為fragment是activity的一個模塊零件放前,它有自己的生命周期,接收它自己的輸入事件糯彬,并且可以在activity運行時添加或者刪除凭语。

Fragment必須總是被嵌入到一個activity之中,并且fragment的生命周期直接受其宿主activity的生命周期的影響撩扒。例如似扔,一旦activity被暫停,它里面所有的fragment也被暫停搓谆,一旦activity被銷毀炒辉,它里面所有的fragment也被銷毀。然而泉手,當activity正在運行時(處于resumed的生命周期狀態(tài))黔寇,你可以單獨的操控每個fragment,比如添加或者刪除斩萌。當你執(zhí)行這樣一項事務(wù)時缝裤,可以將它添加到后臺的一個棧中,這個棧由activity管理著——activity里面的每個后臺棧內(nèi)容實體是fragment發(fā)生過的一條事務(wù)記錄术裸。這個后臺棧允許用戶通過按BACK鍵回退一項fragment事務(wù)(往后導航)倘是。

當你添加一個fragment作為某個activity布局的一部分時,它就存在于這個activity視圖體系內(nèi)部的ViewGroup之中袭艺,并且定義了它自己的視圖布局搀崭。你可以通過在activity布局文件中聲明fragment,用<fragment>元素把fragment插入到activity的布局中猾编,或者是用應用程序源碼將它添加到一個存在的ViewGroup中瘤睹。然而,fragment并不是一個定要作為activity布局的一部分答倡;fragment也可以為activity隱身工作.

Fragment使用FragmentTransaction來操作的轰传,從activity上獲取FragmentTransaction:

主要的操作都是FragmentTransaction的方法
FragmentTransaction transaction = fm.benginTransatcion();//開啟一個事務(wù)
transaction.add()
往Activity中添加一個Fragment
transaction.remove()
從Activity中移除一個Fragment,如果被移除的Fragment沒有添加到回退棧(回退棧后面會詳細說)瘪撇,這個Fragment實例將會被銷毀获茬。
transaction.replace()
使用另一個Fragment替換當前的,實際上就是remove()然后add()的合體~
transaction.hide()
隱藏當前的Fragment倔既,僅僅是設(shè)為不可見恕曲,并不會銷毀
transaction.show()
顯示之前隱藏的Fragment
transaction.commit()
提交事務(wù)

在Activity,如果一個activity跳轉(zhuǎn)(不銷毀的情況)到另外一個activity,按下back鍵就返回到上個activity,Fragment在提交事務(wù)之前調(diào)用:

addToBackStatck(@null String name)

在調(diào)用commit()之前渤涌,為了將事務(wù)添加到fragment事務(wù)后臺棧中佩谣,調(diào)用addToBackStatck()。這個后臺棧由activity管理实蓬,并且允許用戶通過按BACK鍵回退到前一個fragment狀態(tài)茸俭。(相當于反向操作)

repalce()

替換原來的fragment添加新的fragment吊履,被替換的Fragment如果沒有調(diào)用addToBackStatck()直接銷毀,如果添加了addToBackStatck()-生命周期走到onDestroyView(),在堆棧待命

使用addToBackStatck和repalce舉個例子

   public static void replaceFragment(Fragment from, Fragment to) {
        if (from != to) {
            FragmentTransaction transaction = from.getActivity().getSupportFragmentManager().beginTransaction();
            transaction.addToBackStack(to.getClass().getName());
            transaction.replace(R.id.framelayout, to, to.getClass().getName()).commit();
        }
    }

OneFragment

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.one_fragment, null);
        button = view.findViewById(R.id.tv1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // skip();
                //   skipAddToBackStack();
                // skipAddToBackStackan();
                replace();
            }
        });
        Toast.makeText(getActivity(), "重新加載", Toast.LENGTH_SHORT).show();
        return view;
    }
    
    public void replace() {
        FragmentUtils.replaceFragment(this, new TwoFragment());
    }

TwoFragment

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.two_fragment, null);
        view.findViewById(R.id.back).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popBack();//fragment之間返回
            }
        });
        return view;
    }
test1.gif

不知道啥原因调鬓,看回上面的解釋

同時fragmentTransaction的setCustomAnimations方法設(shè)置fragment的進場動畫艇炎。和Activity的 overridePendingTransition();

大概來說前兩個參數(shù)普通進出場動畫,后兩個參數(shù)進出堆棧動畫

public abstract FragmentTransaction setCustomAnimations(@AnimRes int enter,
            @AnimRes int exit);
public abstract FragmentTransaction setCustomAnimations(@AnimRes int enter,
            @AnimRes int exit, @AnimRes int popEnter, @AnimRes int popExit);

Fragment進出的場的效果:


test2.gif

分析一下Fragment進出場動畫,

    public static void skipAddToBackStackan(Fragment from, Fragment to) {
        if (from != to) {
            FragmentTransaction transaction = from.getActivity().getSupportFragmentManager().beginTransaction();
            transaction.addToBackStack(to.getClass().getName());
            transaction.setCustomAnimations(R.anim.fragment_in, R.anim.fragment_out, R.anim.slide_in_right, R.anim.slide_out_right);
            if (to.isAdded()) {
                transaction.hide(from).show(to).commitAllowingStateLoss();
            } else {
                transaction.hide(from).add(R.id.framelayout, to, to.getClass().getName()).commitAllowingStateLoss();
            }
        }
    }

fragment_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromXDelta="100%p"
        android:toXDelta="0"
        />
</set>

fragment_out.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromXDelta="0"
        android:toXDelta="-100%p" />
</set>

slide_in_right.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromXDelta="-100%p"
        android:toXDelta="0"
        />
</set>

slide_out_right.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromXDelta="0"
        android:toXDelta="100%p" />
</set>

簡單的來說腾窝,事務(wù)進堆棧的時候冕臭,屬于普通進出場效果,出棧的時候燕锥,屬于進出堆棧的效果

Fragment之間的數(shù)據(jù)傳遞--它們的數(shù)據(jù)傳遞,感覺就是小偷去農(nóng)田偷菜悯蝉,偷到回自己家煮归形。

主要步驟(該步驟必須在fragmentTransaction.commit()之前完成):
1.創(chuàng)建一個fragment實例
2.創(chuàng)建一個Bundle 對象(其為鍵值對存儲,可以理解為一個Map<K,V>): Bundle bundle = new Bundle();
3.向bundle中傳值:bundle.putString(key,values);
4.將bundle通過setArguments(bundle)方法設(shè)置進fragment:fragment.setArguments(bundle);
5.獲取數(shù)據(jù)getArguments().getBunlde(),getArguments().getInt()......各種get方法

test2.gif
public class OneFragment extends Fragment {
    private Button button;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.one_fragment, null);
        button = view.findViewById(R.id.tv1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // skip();
                //   skipAddToBackStack();
                 skipAddToBackStackan();
               // replace();
            }
        });
        return view;
    }

    public void skipAddToBackStackan() {
        TwoFragment twoFragment = new TwoFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("key", 1);
        twoFragment.setArguments(bundle);
        FragmentUtils.skipAddToBackStackan(this, twoFragment);
    }
public class TwoFragment extends Fragment {

    private Activity activity;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.two_fragment, null);
        view.findViewById(R.id.tv2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(activity, ""+getArguments().getInt("key"), Toast.LENGTH_SHORT).show();
            }
        });
        return view;
    }

再續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鼻由,一起剝皮案震驚了整個濱河市暇榴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蕉世,老刑警劉巖蔼紧,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狠轻,居然都是意外死亡奸例,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門向楼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來查吊,“玉大人,你說我怎么就攤上這事湖蜕÷呗簦” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵昭抒,是天一觀的道長评也。 經(jīng)常有香客問我,道長灭返,這世上最難降的妖魔是什么盗迟? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮婆殿,結(jié)果婚禮上诈乒,老公的妹妹穿的比我還像新娘。我一直安慰自己婆芦,他們只是感情好怕磨,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布喂饥。 她就那樣靜靜地躺著,像睡著了一般肠鲫。 火紅的嫁衣襯著肌膚如雪员帮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天导饲,我揣著相機與錄音捞高,去河邊找鬼。 笑死渣锦,一個胖子當著我的面吹牛硝岗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袋毙,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼型檀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了听盖?” 一聲冷哼從身側(cè)響起胀溺,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎皆看,沒想到半個月后仓坞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡腰吟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年无埃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝎困。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡录语,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出禾乘,到底是詐尸還是另有隱情澎埠,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布始藕,位于F島的核電站蒲稳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏伍派。R本人自食惡果不足惜江耀,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诉植。 院中可真熱鬧祥国,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至壁查,卻和暖如春觉至,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背睡腿。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工标锄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留御吞,地道東北人缓屠。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓蛀序,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挂捻。 傳聞我的和親對象是個殘疾皇子孽锥,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359