你所不知道的Fragment的妙用

你所不知道的Fragment的妙用

GitHub傳送門

2017-07-07-11-49-15.gif
  • 在軟件開發(fā)中登陸功能是十分常見重要的,就以此為例說明fragment的一種用法,讓開發(fā)變得更自如

1.這個(gè)用法的原因和意義

  1. 在未登錄情況下,點(diǎn)擊很多地方都可能要跳到登陸界面,登陸成功后,當(dāng)前頁面需要刷新
  2. 我們的一般做法是StartActivityForResult,在登陸成功后,SetResultOK,finsh登陸頁面。 在當(dāng)前Activity或者fragment的OnActivityResult中根據(jù)RequestCode和ResultCode來判斷登陸是否成功來刷新界面
  3. 由于要登陸的地方很多,重復(fù)在不同的Activity或Fragment中重寫OnactivityResult是個(gè)很頭痛的事,甚至有時(shí)后我們?cè)赼dapter或者dialog等中要獲取這個(gè)登陸的回調(diào)是很麻煩的,數(shù)據(jù)要傳來傳去,用EVenbus也不能簡化我們的操作
  4. 有沒有辦法讓我們,像設(shè)置OnClickListener這樣直接獲得登陸回調(diào)?

2.先看看用法

在任何需要登陸的地方調(diào)用我們?cè)赨tils中寫的一個(gè)靜態(tài)方法
一次寫好從此輕松調(diào)用

   ActivityUtils.startLogin(this, new ActivityUtils.ActivityResultListner() {
            @Override
            public void loginsuccess() {
                ((Button)v).setText("您已登陸");
            }

            @Override
            public void logincancel() {
                Toast.makeText(MainActivity.this,"您已取消登陸",0).show();
            }
        });

3.實(shí)現(xiàn)的方式

  • 利用fragment擁有和activity同步的生命周期
  • frament中可以收到OnActivityResult的回調(diào)
  1. 定義回調(diào)接口
//用abstract class我們?cè)诓恍枰猚ancel回掉時(shí)可以不重寫
   public abstract static class ActivityResultListner {
        public void loginsuccess() {
        }

        public void logincancel() {
        }
    }

2.先定義一個(gè)fragment用于處理回調(diào)

 public static class MyFragment extends Fragment {

        public static final int LOGIN = 123;

        ActivityResultListner listener;

        public void setListener(ActivityResultListner listener) {
            this.listener = listener;
        }

        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == LOGIN) {
                if (resultCode == RESULT_OK) {
                    if (listener != null)
                        listener.loginsuccess();
                } else {
                    if (listener != null)
                        listener.logincancel();
                }
            }
        }
        
  1. 回調(diào)的實(shí)現(xiàn)
  • 傳進(jìn)的Context 要是FragmentActivity的子類
    實(shí)際中
    AppcomatActivity Fragment.getActivity()都是滿足這個(gè)要求的
  • 先把frament添加到activity
  • 根據(jù)fragment的onActivityResult獲取回調(diào)
   public static void startLogin(FragmentActivity context, ActivityResultListner listener) {
        //先看activity是否添加過該fragment, 添加根據(jù)Tag找出 ,沒有就添加
        FragmentManager manager = context.getSupportFragmentManager();
        MyFragment myFragment = null;
        Fragment loginf = manager.findFragmentByTag(MyFragment.LOGIN + "");
        if (loginf == null) {
            myFragment = new MyFragment();
            manager.beginTransaction().add(myFragment, MyFragment.LOGIN + "").commit();
            //這句是讓commit立即生效,不然運(yùn)行會(huì)報(bào)錯(cuò),fragment還沒有被attach
            manager.executePendingTransactions();
        } else {
            myFragment = (MyFragment) loginf;
        }
        //設(shè)置監(jiān)聽
        myFragment.setListener(listener);
        Intent intent = new Intent(context, loginActivity.class);
        myFragment.startActivityForResult(intent, MyFragment.LOGIN);
    }

4.總結(jié)

  • 利用了fragment和activity相同的生命周期,用同樣的方法可以做很多事情,比如申請(qǐng)權(quán)限等
  • 第一次麻煩從此輕松調(diào)用,希望對(duì)各位有所幫助!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容