前言:
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
