android--------實現Activity和Fragment通訊的物件導向的萬能介面

來源:互聯網
上載者:User

標籤: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通訊的物件導向的萬能介面

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.