標籤:main nav bre hid 源碼下載 null pat prim 圖片
前言
開發一個app時,常用Activity和Fragment,由於操作方便Fragment越來越受歡迎,這樣就避免不了Activity和Fragment、Fragment和Fragment之間的通訊,我們知道Fragment和Fragment之間不能直接進行通訊的,而是通過Activity進行通訊。那麼Activity和Fragment有幾種通訊方式呢,它們的優缺點又是什嗎?一 常用的Activity和Fragment幾種通訊方式1 通過Handle在Activity建立一個Handle機制執行個體,然後在建立Fragment的通過構造方法把Handle執行個體傳遞過去,這樣Fragment就可以往Activity傳送資料了。但這樣如下缺點:(1)Activity和Fragment之間耦合性增大;(2)Activity處理後的結果不能即時反饋給Fragment;(3)提高了記憶體流失風險;2 使用static變數缺點很明確增大記憶體消耗;3 使用廣播分別在Activity和Fragment中註冊廣播,這樣就可以實現通訊了。其缺點:(1)效能差,有延遲,使用者體驗就會差;(2)一般使用的是標準廣播,一個發送,多個接收者,大材小用,效能差;(3)代碼冗餘;(4)傳播的資料有限;4 EventBus 、rxBus(俗稱萬能油)其使用方法參考官方文檔,其優點就是實用起來簡單方便,其缺點也很明顯:(1)EventBus 、rxBus其內部使用的是反射機制,那麼其效能就會降低;(2)代碼維護困難(不熟悉的項目代碼的新人很難找到實現的方法在是如何調用的);(3)資料返回困難,它們是單向傳遞;5 普通介面在Fragment寫一個介面,讓Activity去實現這個介面,通過這個介面把Activity與Fragment綁定在一起,這樣Activity和Fragment即時進行通訊了,其實Google推薦就是這麼乾的,由於每個Fragment都寫一個介面,就會造成代碼冗餘;如果Fragment少的話還好,多的話,Activity實現多個介面,顯得Activity頭部很大,況且介面的命名也是一個問題;二 萬能介面如果在5的基礎能夠解決代碼冗餘、介面命名就好了,我們知道一個函數包括函數名、函數體、參數、傳回值,那麼就可以通過搭建一個簡單的架構實現上述問題。 建立無(有)參數無(有)四類 定義完所有的介面抽象類別之後,我們在定義一個介面管理類,通過介面管理類來管理調用對應的函數方法。
最後在Activity中實現通訊:
public class MainActivity extends AppCompatActivity{ private ArrayList<Fragment> fragmentArrayList = new ArrayList<>(); private Fragment mCurrentFragment; private BottomNavigationBar mBottomNavigationBar; BadgeItem badgeItem; FragmentManager mFragmentManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView(){ mFragmentManager = getSupportFragmentManager(); initFragemnt(); showFragment(0); mBottomNavigationBar = (BottomNavigationBar) findViewById(R.id.bottom_navigation_bar); mBottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED); mBottomNavigationBar.setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC); mBottomNavigationBar.setBarBackgroundColor(android.R.color.white); badgeItem = new BadgeItem() .setBackgroundColor(Color.RED).setText("99") .setHideOnSelect(true); //設定被選中時隱藏角標 mBottomNavigationBar .setActiveColor(R.color.colorAccent) //設定選中的顏色 .setInActiveColor(R.color.colorPrimary);//未選中 mBottomNavigationBar.addItem(new BottomNavigationItem(R.mipmap.ic_launcher, "首頁")) .addItem(new BottomNavigationItem(R.mipmap.ic_launcher, "店鋪")) .addItem(new BottomNavigationItem(R.mipmap.ic_launcher, "購物車")) .addItem(new BottomNavigationItem(R.mipmap.ic_launcher, "我的").setBadgeItem(badgeItem)) .initialise(); mBottomNavigationBar.setTabSelectedListener(new BottomNavigationBar.OnTabSelectedListener(){ @Override public void onTabSelected(int position) { showFragment(position); } @Override public void onTabUnselected(int position) { } @Override public void onTabReselected(int position) { } }); } private void showFragment(int page) { FragmentTransaction mFragmentTransaction = mFragmentManager .beginTransaction(); if (mCurrentFragment != null) { mFragmentTransaction.hide(mCurrentFragment); } mCurrentFragment = fragmentArrayList.get(page); if (mCurrentFragment.isAdded()) { mFragmentTransaction.show(mCurrentFragment); }else { mFragmentTransaction.add(R.id.fragmenta, mCurrentFragment,mCurrentFragment.getClass().getName()); } mFragmentTransaction.commitAllowingStateLoss(); } private void initFragemnt(){ fragmentArrayList.add(new A()); fragmentArrayList.add(new B()); fragmentArrayList.add(new C()); fragmentArrayList.add(new D()); } public void setFunctionForFragment(final String tag){ BaseFragment fragment=(BaseFragment)mFragmentManager.findFragmentByTag(tag); FunctionManager functionManager=FunctionManager.getInstance(); fragment.setmFunctionManager(functionManager.addFunction(new FunctionNoParamNotResult(A.INTERFCE) { @Override public void function() { Toast.makeText(MainActivity.this,"無參無傳回值"+tag,Toast.LENGTH_LONG).show(); } }).addFunction(new FunctionNoParamWithResult<String>(B.INTERFCE) { @Override public String function() { Toast.makeText(MainActivity.this,"無參有傳回值",Toast.LENGTH_LONG).show(); return "張三"; } }).addFunction(new FunctionWithParamNoResult<Integer>(C.INTERFCE) { @Override public void function(Integer o) { Toast.makeText(MainActivity.this,"有參無傳回值"+o,Toast.LENGTH_LONG).show(); } }).addFunction(new FunctionWithParamResultn<String>(D.INTERFCE) { @Override public String function(String o) { Toast.makeText(MainActivity.this,"有參有傳回值"+o,Toast.LENGTH_LONG).show(); return "zhangqie"; } })); }}
:
源碼下載Github:https://github.com/DickyQie/android-fragment-interface
android--------實現Activity和Fragment通訊的物件導向的萬能介面