前言:
fragment刷新對很多人來說是個坑。
不管fragment刷新 fragment
還是fragment 刷新 activity
或是activity 刷新 fragment
都可以用,萬用!
有人應該會有疑問,這不是廣播嗎?
如果我參數設的跟別人一樣,不就會喚起我這個app了?
但仔細看他的元件名稱前方有個Local,應該就不擔心了吧。他只在你app內運作。
當你銷毀fragment 或是 activity時,註銷它就可以了。
開始之前如果對FragmentPagerAdapter、ViewPager不熟,可以先參考一下這篇。
http://nikeru8.blogspot.com/2017/11/androidfragmentpageradapterviewpager.html
重點程式碼:
//參數 protected LocalBroadcastManager broadcastManager; //接收廣播 (信件 然後你要 do something) private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(final Context context, Intent intent) { // 想像成從遠方寄來的信,可以是任何東西 String action = intent.getStringExtra("changeSomething"); if ("changeText".equals(action)) { new Handler().post(new Runnable() { @Override public void run() { //do something text_change.setText("你按了我~!!我刷新囉!"); } }); } } }; //註冊廣播 (你家的信箱) private void registerReceiver() { broadcastManager = LocalBroadcastManager.getInstance(getActivity()); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("changeFragment"); broadcastManager.registerReceiver(mReceiver, intentFilter); } //呼叫刷新畫面(寄件人) private void refreshData() { //指定要刷新的頁面給intent ( Intent intent = new Intent("changeFragment"); //要帶過去的參數 intent.putExtra("changeSomething", "changeText"); LocalBroadcastManager.getInstance(activity).sendBroadcast(intent); } //離開fragment後,消滅廣播 (搬家後,信箱地址換掉) @Override public void onDetach() { super.onDetach(); broadcastManager.unregisterReceiver(mReceiver); } //註冊廣播 (蓋成房子後,買一個信箱) @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); registerReceiver(); }
這邊解釋一下,可以想像成fragment是一棟房子,你要寄信過去。
房子-fragment
信箱-registerReceiver()
寄件人-refreshData()
信件-mReceiver
有了房子(fragment)就必須有信箱(registerReceiver())才能收信,所以要在房子內蓋一個信箱。
當寄件人(refreshData())寄出了信,就會投地到信箱(registerReceiver()),然後你可以開啟信件(mReceiver)收到任何東西、做任何事。
夠簡單吧。
就不全部貼出來了,直接看代碼吧。
github:https://github.com/nikeru8/refreshFragment