日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

优雅的让Fragment监听返回键

發(fā)布時(shí)間:2024/6/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 优雅的让Fragment监听返回键 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載請(qǐng)注明出處:http://write.blog.csdn.net/postedit/40507387

?

Activity可以很容易的得到物理返回鍵的監(jiān)聽(tīng)事件,而Fragment卻不能。假設(shè)FragmentActivity有三個(gè)Fragment,一般安卓用戶期望點(diǎn)擊返回鍵會(huì)一層層返回到FragmentActivity。當(dāng)然,我們可以將每個(gè)Fragment對(duì)應(yīng)的Transaction放到BackStack中,但是如果每個(gè)Fragment有對(duì)返回事件的特殊消費(fèi),那么在FragmentActivity的onBackPressed()中的代碼就會(huì)比較混亂,例如:

?

[java]?view plaincopy
  • @Override??
  • public?void?onBackPressed()?{??
  • ????if(selectedFragment.equals(fragmentA)?&&?fragmentA.hasExpandedRow())?{??
  • ????????fragmentA.collapseRow();??
  • ????}?else?if(selectedFragment.equals(fragmentA)?&&?fragmentA.isShowingLoginView())?{??
  • ????????fragmentA.hideLoginView();??
  • ????}?else?if(selectedFragment.equals(fragmentA))?{??
  • ????????popBackStack();??
  • ????}?else?if(selectedFragment.equals(fragmentB)?&&?fragmentB.hasCondition1())?{??
  • ????????fragmentB.reverseCondition1();??
  • ????}?else?if(selectedFragment.equals(fragmentB)?&&?fragmentB.hasCondition2())?{??
  • ????????fragmentB.reverseCondition2();??
  • ????}?else?if(selectedFragment.equals(fragmentB))?{??
  • ????????popBackStack();??
  • ????}?else?{??
  • ????????//?handle?by?activity??
  • ????????super.onBackPressed();??
  • ????}??
  • }??
  • 這對(duì)于有代碼潔癖的程序猿顯然是不能容忍的,后來(lái)發(fā)現(xiàn)了一種優(yōu)雅的解決方案。

    ?

    首先創(chuàng)建一個(gè)抽象類BackHandledFragment,該類有一個(gè)抽象方法onBackPressed(),所有BackHandledFragment的子類在onBackPressed方法中處理各自對(duì)Back事件的消費(fèi)邏輯。onBackPressed返回布爾值,宿主FragmentActivity將會(huì)根據(jù)該方法的返回值判斷子Fragment是否有消費(fèi)Back事件。此外,宿主FragmentActivity還會(huì)保持一份當(dāng)前Fragment的引用,當(dāng)用戶按下Back鍵時(shí),宿主Activity會(huì)判斷當(dāng)前Fragment是否需要消費(fèi)該事件,如果沒(méi)有Fragment消費(fèi)才會(huì)自己消費(fèi)。

    ?

    [java]?view plaincopy
  • public?abstract?class?BackHandledFragment?extends?Fragment?{??
  • ??
  • ????protected?BackHandledInterface?mBackHandledInterface;??
  • ??????
  • ????/**?
  • ?????*?所有繼承BackHandledFragment的子類都將在這個(gè)方法中實(shí)現(xiàn)物理Back鍵按下后的邏輯?
  • ?????*?FragmentActivity捕捉到物理返回鍵點(diǎn)擊事件后會(huì)首先詢問(wèn)Fragment是否消費(fèi)該事件?
  • ?????*?如果沒(méi)有Fragment消息時(shí)FragmentActivity自己才會(huì)消費(fèi)該事件?
  • ?????*/??
  • ????protected?abstract?boolean?onBackPressed();??
  • ??????
  • ????@Override??
  • ????public?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????if(!(getActivity()?instanceof?BackHandledInterface)){??
  • ????????????throw?new?ClassCastException("Hosting?Activity?must?implement?BackHandledInterface");??
  • ????????}else{??
  • ????????????this.mBackHandledInterface?=?(BackHandledInterface)getActivity();??
  • ????????}??
  • ????}??
  • ??????
  • ????@Override??
  • ????public?void?onStart()?{??
  • ????????super.onStart();??
  • ????????//告訴FragmentActivity,當(dāng)前Fragment在棧頂??
  • ????????mBackHandledInterface.setSelectedFragment(this);??
  • ????}??
  • ??????
  • }??
  • 宿主FragmentActivity需要繼承BackHandledIntegerface,子Fragment會(huì)通過(guò)該接口告訴宿主FragmentActivity自己是當(dāng)前屏幕可見(jiàn)的Fragment。

    ?

    ?

    [java]?view plaincopy
  • public?interface?BackHandledInterface?{??
  • ??
  • ????public?abstract?void?setSelectedFragment(BackHandledFragment?selectedFragment);??
  • }??
  • 所以在Fragment的onCreate中會(huì)判斷宿主FragmentActivity是否已繼承了該接口。在Fragment的onStart()方法中就會(huì)調(diào)用該接口告訴宿主FragmentActivity自己是當(dāng)前屏幕可見(jiàn)的Fragment。
    宿主FragmentActivity就可以在onBackPressed()方法中對(duì)Back事件進(jìn)行判斷處理了。

    ?

    ?

    [java]?view plaincopy
  • public?class?MainActivity?extends?FragmentActivity?implements?BackHandledInterface{??
  • ??
  • ????private?BackHandledFragment?mBackHandedFragment;??
  • ????private?boolean?hadIntercept;??
  • ??
  • ????@Override??
  • ????public?void?setSelectedFragment(BackHandledFragment?selectedFragment)?{??
  • ????????this.mBackHandedFragment?=?selectedFragment;??
  • ????}??
  • ??????
  • ????@Override??
  • ????public?void?onBackPressed()?{??
  • ????????if(mBackHandedFragment?==?null?||?!mBackHandedFragment.onBackPressed()){??
  • ????????????if(getSupportFragmentManager().getBackStackEntryCount()?==?0){??
  • ????????????????super.onBackPressed();??
  • ????????????}else{??
  • ????????????????getSupportFragmentManager().popBackStack();??
  • ????????????}??
  • ????????}??
  • ????}??
  • }??
  • ?

    轉(zhuǎn)載于:https://www.cnblogs.com/xiaorenwu702/p/4561393.html

    總結(jié)

    以上是生活随笔為你收集整理的优雅的让Fragment监听返回键的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。