• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Codejie's C++ Space

            Using C++

            EL : Fragment and FragmentManager


                考慮到為了減少UI的'刷新效果',EL使用Fragment來(lái)代替常規(guī)的Activity方式.
                Fragment代替Activity的好處很多,比如沒(méi)有不同UI間切換的'閃動(dòng)',視覺(jué)是上也有加快顯示的效果.但這種效果也是有代價(jià)的, 大量Activity方式下的工作,在Fragment時(shí),不得不自己來(lái)實(shí)現(xiàn),比如UI的'壓棧'等等.
                這里記錄下EL實(shí)現(xiàn)中,碰到的跟Fragment相關(guān)的問(wèn)題. (Fragment相關(guān)文檔的官方鏈接在這里)

                1. 參數(shù)傳遞
                    Activity切換時(shí),可以在StartActivity()時(shí),通過(guò)Intent的方式將所需參數(shù)傳遞給下一個(gè)Activity. 但在Fragment方式下就不行了,此時(shí)可使用/參考Fragment支持的setArguments()和getArguments(). EL中所有Fragment都繼承于BaseFragment,在顯示Fragment時(shí),使用設(shè)計(jì)的OnArgument()接口傳遞參數(shù).
                    fragment.onArguments(args);
                    fragmentManager.beginTransaction().show(fragment).commit();

                2. 界面切換
                    FragmentManager是用于管理Fragment的類,通過(guò)內(nèi)部的FragmentTranscation對(duì)象實(shí)現(xiàn)Fragment的加載/顯示/隱藏/移除等操作. EL實(shí)現(xiàn)中,使用FragmentSwitcher類封裝了FrangmentManager,以實(shí)現(xiàn)某些更靈活的Fragment管理,比如某些Fragment在被切換是需要?jiǎng)h除,而其他的僅需要隱藏等操作.
                public enum Type {
                    
                    LIST("list", false), SHOW("show", false), ABOUT("about", true), SETTING("setting", true),
                    DOWNLOAD("download", true);
                    
                    private final String title;
                    private final boolean removed;
                    
                    private Type(final String title, boolean removed) {
                        this.title = title;
                        this.removed = removed;
                    }
                    
                    public String getTitle() {
                        return title;
                    }

                    public boolean hasRemoved() {
                        return removed;
                    }
                    
                    public static Type getType(final String title) {
                        if (title.equals(LIST.getTitle())) {
                            return LIST;
                        } else if (title.equals(SHOW.getTitle())) {
                            return SHOW;
                        } else {
                            return null;
                        }
                    }
                    
                }

                public boolean show(Type type, Bundle args) {
                    if (curType != null) {
                        if (curType == type) {
                            ((BaseFragment) fragmentManager.findFragmentByTag(type.getTitle())).onArguments(args);                
                            return true;
                        } else {
                            hide(curType);
                        }
                    }
                    
                    BaseFragment fragment = (BaseFragment) fragmentManager.findFragmentByTag(type.getTitle());
                    if (fragment == null) {
                        fragment = create(type);
                        if (fragment == null) {
                            return false;
                        }
                    }
                    
                    fragment.onArguments(args);
                    fragmentManager.beginTransaction().show(fragment).commit();
                    curType = type;
                    
                    return true;
                }

                3. Fragment的棧
                    Activity在切換時(shí),通常情況下可以通過(guò)BACK鍵返回前一個(gè)Activity,是因?yàn)榇嬖谝粋€(gè)'棧'來(lái)存放前面的Activity. Fragment也有棧的概念,但在操作上就需要自己主動(dòng)調(diào)用了 -- Fragment隱藏時(shí),壓棧; Fragment退出時(shí),出棧.
                private void hide(Type type) {
                    BaseFragment fragment = (BaseFragment) fragmentManager.findFragmentByTag(type.getTitle());
                    if (fragment != null) {
                        if (type.hasRemoved()) {
                            fragmentManager.beginTransaction().remove(fragment).commit();
                        } else {
                            FragmentTransaction ft = fragmentManager.beginTransaction();
                            ft.addToBackStack(type.getTitle());
                            ft.hide(fragment);
                            ft.commit();
            //                fragmentManager.beginTransaction().hide(fragment).commit();
                        }
                        
                        curType = null;            
                    }
                }

                public boolean showPrevFragment() {
                    int count = fragmentManager.getBackStackEntryCount();
                    if (count > 0) {
                        String name = fragmentManager.getBackStackEntryAt(count - 1).getName();
                        fragmentManager.popBackStack();// .popBackStackImmediate();
                        Type type = Type.getType(name);
                        if (type != null) {
                            show(type);
                            return true;
                        }
                    }
                    
                    return false;
                }


                總的來(lái)說(shuō),Fragment要想用著方便,自己使用FragmentSwitcher和BaseFragment來(lái)封裝下FragmentManager和Fragment還是不錯(cuò)的選擇.

                Fragment看起來(lái)很美,用起來(lái)真是發(fā)瘋啊.上面這些都是實(shí)現(xiàn)EL中碰到的問(wèn)題,這里做下記錄,怕回頭又忘記'痛苦地翻文檔'的日子...

                另,EL基本完工,這兩天可發(fā)布Alpha版了...

            posted on 2013-08-11 10:08 codejie 閱讀(1915) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 隨筆而已 、G7

            公告

            Using C++

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久久久国产精品麻豆AR影院 | 一本色道久久综合狠狠躁| 久久亚洲av无码精品浪潮| 日韩久久久久中文字幕人妻| 久久人人爽人人爽人人片AV麻烦| 亚洲精品乱码久久久久久蜜桃图片| 奇米综合四色77777久久| 99久久国产综合精品麻豆| 香蕉久久AⅤ一区二区三区| 一本色综合网久久| 热综合一本伊人久久精品| 国内精品久久久久影院薰衣草| 久久99国产精品一区二区| 午夜肉伦伦影院久久精品免费看国产一区二区三区| 精品久久亚洲中文无码| 久久97久久97精品免视看| 色妞色综合久久夜夜 | 亚洲国产精品嫩草影院久久| 久久综合给合久久狠狠狠97色| 7国产欧美日韩综合天堂中文久久久久| 亚州日韩精品专区久久久| 久久九九全国免费| 久久综合精品国产二区无码| 波多野结衣AV无码久久一区| 久久综合九色综合欧美就去吻| 99久久777色| 久久精品国产99久久无毒不卡| 亚洲欧洲中文日韩久久AV乱码| 99久久综合国产精品二区| 精品久久久久久久久午夜福利| 久久99热这里只有精品国产| 99久久这里只精品国产免费| 午夜精品久久久久久影视777 | 久久99久国产麻精品66| 思思久久99热只有频精品66| 久久精品国产WWW456C0M| Xx性欧美肥妇精品久久久久久| 97精品伊人久久久大香线蕉| AAA级久久久精品无码区| 精品久久久久久国产三级| 色诱久久av|