1. 程式人生 > >android--------實現Activity和Fragment通信的面向對象的萬能接口

android--------實現Activity和Fragment通信的面向對象的萬能接口

inter strong .sh state alt mage 技術 content allow

前言

開發一個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實時進行通信了,其實谷歌推薦就是這麽幹的,由於每個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通信的面向對象的萬能接口