zoukankan      html  css  js  c++  java
  • Android Fragment Base

    public class FragmentTabsActivity extends FragmentActivity implements OnClickListener {
    
        //定义FragmentTabHost对象
        private SaveFragmentTabHost mTabHost;
        //定义数组来存放Fragment界面
        private final Class[] fragmentArray = { A.class, B.class, C.class, D.class, E.class,
                F.class, G.class, H.class, I.class };
        //定义数组来存放按钮图片
        private int mIconFontArray[] = { R.string.A, R.string.B, R.string.C, R.string.D, R.string.E };
        private int mIconSelectArray[] = { R.string.AA, R.string.BB, R.string.CC, R.string.DD,
                R.string.EE};
        //Tab选项卡的文字
        private long keyNum;
    
        private LinearLayout tabsParent;
        private MenuDialog menuDialog;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initViews();
            keyNum = 0;
        }
    
        /**
         * 在这里获取到每个需要用到的控件的实例,并给它们设置好必要的点击事件。
         */
        private void initViews() {
            //实例化布局对象
            // 得到fragment的个数
            int count = fragmentArray.length;
            tabsParent = (LinearLayout) findViewById(R.id.tabsParent);
            //实例化TabHost对象,得到TabHost
            mTabHost = (SaveFragmentTabHost) findViewById(android.R.id.tabhost);
            mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
    
            for (int i = 0; i < count; i++) {
                // 为每一个Tab按钮设置图标、文字和内容
                String name = String.valueOf(i);
                TabSpec tabSpec = mTabHost.newTabSpec(name).setIndicator(name);
                //将Tab按钮添加进Tab选项卡中
                mTabHost.addTab(tabSpec, fragmentArray[i], null);
                //设置Tab按钮的背景
                mTabHost.getTabWidget().getChildAt(i).setBackgroundResource(R.drawable.selector_tab);
            }

    mytabs = getTabHost();
    mytabs.setOnTabChangedListener(new OnTabChangeListener() {
    @Override
    public void onTabChanged(String arg0) {
    Log.i("***Selected Tab", "Im currently in tab with index::" + mytabs.getCurrentTab());
    }
    });

    
            setupTabsBar();
            menuDialog = new MenuDialog(mActivity, mTabHost);
        }
    
        /**
         * 给Tab按钮设置图标和文字
         */
        private LinearLayout homeLayout, celebrityLayout, brandLayout, exploreLayout, moreLayout;
        private TextView homeTv, celebrityTv, brandTv, exploreTv, moreTv;
    
        private void setupTabsBar() {
            homeLayout = (LinearLayout) findViewById(R.id.tabLayoutHome);
            homeLayout.setSelected(true);
            celebrityLayout = (LinearLayout) findViewById(R.id.tabLayoutCelebrity);
            brandLayout = (LinearLayout) findViewById(R.id.tabLayoutBrand);
            exploreLayout = (LinearLayout) findViewById(R.id.tabLayoutExplore);
            moreLayout = (LinearLayout) findViewById(R.id.tabLayoutMore);
    
            homeLayout.setOnClickListener(this);
            celebrityLayout.setOnClickListener(this);
            brandLayout.setOnClickListener(this);
            exploreLayout.setOnClickListener(this);
            moreLayout.setOnClickListener(this);
    
            homeTv = (TextView) findViewById(R.id.tabIconHome);
            celebrityTv = (TextView) findViewById(R.id.tabIconCelebrity);
            brandTv = (TextView) findViewById(R.id.tabIconBrand);
            exploreTv = (TextView) findViewById(R.id.tabIconExplore);
            moreTv = (TextView) findViewById(R.id.tabIconMore);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.tabLayoutHome:
                setCurrentFragment(0);
                break;
            case R.id.tabLayoutCelebrity:
                setCurrentFragment(1);
                break;
            case R.id.tabLayoutBrand:
                setCurrentFragment(2);
                break;
            case R.id.tabLayoutExplore:
                setCurrentFragment(3);
                break;
            case R.id.tabLayoutMore:
                setCurrentFragment(4);
                menuDialog.home();
                break;
            }
        }
    
        private void setCurrentFragment(int index) {
            homeLayout.setSelected(index == 0);
            celebrityLayout.setSelected(index == 1);
            brandLayout.setSelected(index == 2);
            exploreLayout.setSelected(index == 3);
            moreLayout.setSelected(index == 4);
    
            homeTv.setText(index == 0 ? getResources().getString(mIconSelectArray[0]) : getResources().getString(mIconFontArray[0]));
            celebrityTv.setText(index == 1 ? getResources().getString(mIconSelectArray[1]) : getResources().getString(mIconFontArray[1]));
            brandTv.setText(index == 2 ? getResources().getString(mIconSelectArray[2]) : getResources().getString(mIconFontArray[2]));
            exploreTv.setText(index == 3 ? getResources().getString(mIconSelectArray[3]) : getResources().getString(mIconFontArray[3]));
            moreTv.setText(index == 4 ? getResources().getString(mIconSelectArray[4]) : getResources().getString(mIconFontArray[4]));
            if (index != 4)
                mTabHost.setCurrentTab(index);
    
        }
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
                if ((System.currentTimeMillis() - keyNum) > 2000) {
                    Toast.makeText(mActivity, "再按一次退出", Toast.LENGTH_SHORT).show();
                    keyNum = System.currentTimeMillis();
                } else {
                    imageLoader.stop();
                    System.exit(0);
                    finish();
                    android.os.Process.killProcess(android.os.Process.myPid());
                }
                return true;
            }
            return super.onKeyDown(keyCode, event);
        }
    
    }
    /**BaseActivity**/
    public class Activity extends Activity implements OnClickListener {
        /**tag 用于测试log用  **/
        public String tag = this.getClass().getSimpleName();
        /**Activity**/
        protected Activity mActivity;
        /**loading**/
        protected Dialog progressDialog;
        /** 实例化ImageLoader**/
        protected ImageLoader imageLoader;
        /**显示图片设置**/
        protected DisplayImageOptions options;
        /**用户Token**/
        public String userToken;
    
        public ObjectMapper mapper = new ObjectMapper();
    
        /**翻页相关**/
        public int start = 1;
        public int refreshCnt = 1;
        public int dataStatus;
    
        public static final int DONE = 0;
    
        public static final int INITDATA = 1;
    
        public static final int REFRESH = 2;
    
        public static final int LOADDATA = 3;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.e(tag, "onCreate------");
    
            mActivity = DFActivity.this;
    
            progressDialog = DialogUtil.createLoadingDialog(mActivity, R.string.load_data_content);
    
            imageLoader = ImageLoader.getInstance();
            options = new AppUtils().getOptions();
    
            userToken = SharedUtil.getInstance(mActivity).getString(AppConstants.JSON_USER_TOKEN);
    
        }
    
        /**
         * 按钮注册和监听事件注册
         * 注册IconFont字体
         */
        /**
         * @param title
         */
        public void initActionBar(String title) {
            TextView actionTitle = (TextView) findViewById(R.id.actionTitle);
            actionTitle.setText(title);
    
            Button btnBack = (Button) findViewById(R.id.actionBack);
            AppUtils.iconFont(mActivity, btnBack, 30, 0);
            btnBack.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    mActivity.finish();
                }
            });
    
            Button btnMenu = (Button) findViewById(R.id.actionMenu);
            AppUtils.iconFont(mActivity, btnMenu, 30, 0);
            btnMenu.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //                mActivity.finish();
                }
            });
        }
    
        @Override
        public void onClick(View v) {
    
        }
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
                this.finish();
            }
            return super.onKeyDown(keyCode, event);
        }
    
        public void initFollow() {
            //        followed = mActivity.getString(R.string.btnFollowed);
            //        addFollow = mActivity.getString(R.string.btnAddFollow);
    
        }
    
        public void showLog(Object log) {
            Log.e(tag, log.toString());
        }
    
        /**
         * Toast.makeText
         * 
         * @param mContext
         * @param string
         */
        public void showToast(Object... string) {
            Toast.makeText(mActivity, String.valueOf(string.toString()), Toast.LENGTH_SHORT).show();
        }
    
        public void goAct(Class<?> cls, Boolean finish) {
            Intent intent = new Intent(mActivity, cls);
            startActivity(intent);
            if (finish) {
                this.finish();
            }
        }
    
        @Override
        public void onStart() {
            super.onStart();
            Log.e(tag, "onStart------");
        }
    
        @Override
        public void onResume() {
            super.onResume();
            Log.e(tag, "onResume------");
        }
    
        @Override
        public void onPause() {
            super.onPause();
            Log.e(tag, "onPause------");
        }
    
        @Override
        public void onStop() {
            super.onStop();
            Log.e(tag, "onStop------");
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            Log.e(tag, "onDestroy------");
        }
    
    }

    xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".FragmentTabsActivity" >
    
        <FrameLayout
            android:id="@+id/realtabcontent"
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1" />
    
        <SaveFragmentTabHost
            android:id="@android:id/tabhost"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:visibility="gone" >
    
            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_weight="0" />
        </SaveFragmentTabHost>
    
     <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="53dp"
        android:background="@android:color/black"
        android:baselineAligned="false"
        tools:context=".FragmentTabsActivity" >
    
        <LinearLayout
            android:id="@+id/tabLayoutHome"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:background="@drawable/button_actionbar_menu"
            android:gravity="center"
            android:orientation="vertical" >
    
            <TextView
                android:id="@+id/tabIconHome"
                style="@style/tab_top_style"
                android:text="@string/fontHomeSelect" >
            </TextView>
    
            <TextView
                style="@style/tab_bottom_style"
                android:text="@string/stringHome" >
            </TextView>
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/tabLayoutCelebrity"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:background="@drawable/button_actionbar_menu"
            android:gravity="center"
            android:orientation="vertical" >
    
            <TextView
                android:id="@+id/tabIconCelebrity"
                style="@style/tab_top_style"
                android:text="@string/fontCelebrity" >
            </TextView>
    
            <TextView
                style="@style/tab_bottom_style"
                android:text="@string/stringCelebrity" >
            </TextView>
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/tabLayoutBrand"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:background="@drawable/button_actionbar_menu"
            android:gravity="center"
            android:orientation="vertical" >
    
            <TextView
                android:id="@+id/tabIconBrand"
                style="@style/tab_top_style"
                android:text="@string/fontBrand" >
            </TextView>
    
            <TextView
                style="@style/tab_bottom_style"
                android:text="@string/stringBrand" >
            </TextView>
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/tabLayoutExplore"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:background="@drawable/button_actionbar_menu"
            android:gravity="center"
            android:orientation="vertical" >
    
            <TextView
                android:id="@+id/tabIconExplore"
                style="@style/tab_top_style"
                android:text="@string/fontExplore" >
            </TextView>
    
            <TextView
                style="@style/tab_bottom_style"
                android:text="@string/stringExplore" >
            </TextView>
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/tabLayoutMore"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:background="@drawable/button_actionbar_menu"
            android:gravity="center"
            android:orientation="vertical" >
    
            <TextView
                android:id="@+id/tabIconMore"
                style="@style/tab_top_style"
                android:text="@string/fontMore" >
            </TextView>
    
            <TextView
                style="@style/tab_bottom_style"
                android:text="@string/stringMore" >
            </TextView>
        </LinearLayout>
    
    </LinearLayout><?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="53dp"
        android:background="@android:color/black"
        android:baselineAligned="false"
        tools:context=".FragmentTabsActivity" >
    
        <LinearLayout
            android:id="@+id/tabLayoutHome"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:background="@drawable/button_actionbar_menu"
            android:gravity="center"
            android:orientation="vertical" >
    
            <TextView
                android:id="@+id/tabIconHome"
                style="@style/tab_top_style"
                android:text="@string/fontHomeSelect" >
            </TextView>
    
            <TextView
                style="@style/tab_bottom_style"
                android:text="@string/stringHome" >
            </TextView>
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/tabLayoutCelebrity"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:background="@drawable/button_actionbar_menu"
            android:gravity="center"
            android:orientation="vertical" >
    
            <TextView
                android:id="@+id/tabIconCelebrity"
                style="@style/tab_top_style"
                android:text="@string/fontCelebrity" >
            </TextView>
    
            <TextView
                style="@style/tab_bottom_style"
                android:text="@string/stringCelebrity" >
            </TextView>
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/tabLayoutBrand"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:background="@drawable/button_actionbar_menu"
            android:gravity="center"
            android:orientation="vertical" >
    
            <TextView
                android:id="@+id/tabIconBrand"
                style="@style/tab_top_style"
                android:text="@string/fontBrand" >
            </TextView>
    
            <TextView
                style="@style/tab_bottom_style"
                android:text="@string/stringBrand" >
            </TextView>
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/tabLayoutExplore"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:background="@drawable/button_actionbar_menu"
            android:gravity="center"
            android:orientation="vertical" >
    
            <TextView
                android:id="@+id/tabIconExplore"
                style="@style/tab_top_style"
                android:text="@string/fontExplore" >
            </TextView>
    
            <TextView
                style="@style/tab_bottom_style"
                android:text="@string/stringExplore" >
            </TextView>
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/tabLayoutMore"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:background="@drawable/button_actionbar_menu"
            android:gravity="center"
            android:orientation="vertical" >
    
            <TextView
                android:id="@+id/tabIconMore"
                style="@style/tab_top_style"
                android:text="@string/fontMore" >
            </TextView>
    
            <TextView
                style="@style/tab_bottom_style"
                android:text="@string/stringMore" >
            </TextView>
        </LinearLayout>
    
    </LinearLayout>
    </LinearLayout>

    SaveFragmentTabHost

    /*
     * Copyright (C) 2012 The Android Open Source Project
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    /**
     * Special TabHost that allows the use of {@link Fragment} objects for its tab
     * content. When placing this in a view hierarchy, after inflating the hierarchy
     * you must call {@link #setup(Context, FragmentManager, int)} to complete the
     * initialization of the tab host.
     * 
     * <p>
     * Here is a simple example of using a FragmentTabHost in an Activity:
     * 
     * {@sample
     * development/samples/Support4Demos/src/com/example/android/supportv4/app/
     * FragmentTabs.java complete}
     * 
     * <p>
     * This can also be used inside of a fragment through fragment nesting:
     * 
     * {@sample
     * development/samples/Support4Demos/src/com/example/android/supportv4/app/
     * FragmentTabsFragmentSupport.java complete}
     */
    public class SaveFragmentTabHost extends TabHost implements TabHost.OnTabChangeListener {
        private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
        private FrameLayout mRealTabContent;
        private Context mContext;
        private FragmentManager mFragmentManager;
        private int mContainerId;
        private TabHost.OnTabChangeListener mOnTabChangeListener;
        private TabInfo mLastTab;
        private boolean mAttached;
    
        static final class TabInfo {
            private final String tag;
            private final Class<?> clss;
            private final Bundle args;
            private Fragment fragment;
    
            TabInfo(String _tag, Class<?> _class, Bundle _args) {
                tag = _tag;
                clss = _class;
                args = _args;
            }
        }
    
        static class DummyTabFactory implements TabHost.TabContentFactory {
            private final Context mContext;
    
            public DummyTabFactory(Context context) {
                mContext = context;
            }
    
            @Override
            public View createTabContent(String tag) {
                View v = new View(mContext);
                v.setMinimumWidth(0);
                v.setMinimumHeight(0);
                return v;
            }
        }
    
        static class SavedState extends BaseSavedState {
            String curTab;
    
            SavedState(Parcelable superState) {
                super(superState);
            }
    
            private SavedState(Parcel in) {
                super(in);
                curTab = in.readString();
            }
    
            @Override
            public void writeToParcel(Parcel out, int flags) {
                super.writeToParcel(out, flags);
                out.writeString(curTab);
            }
    
            @Override
            public String toString() {
                return "FragmentTabHost.SavedState{" + Integer.toHexString(System.identityHashCode(this)) + " curTab=" + curTab + "}";
            }
    
            public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {
                public SavedState createFromParcel(Parcel in) {
                    return new SavedState(in);
                }
    
                public SavedState[] newArray(int size) {
                    return new SavedState[size];
                }
            };
        }
    
        public SaveFragmentTabHost(Context context) {
            // Note that we call through to the version that takes an AttributeSet,
            // because the simple Context construct can result in a broken object!
            super(context, null);
            initFragmentTabHost(context, null);
        }
    
        public SaveFragmentTabHost(Context context, AttributeSet attrs) {
            super(context, attrs);
            initFragmentTabHost(context, attrs);
        }
    
        private void initFragmentTabHost(Context context, AttributeSet attrs) {
            TypedArray a = context.obtainStyledAttributes(attrs, new int[] { android.R.attr.inflatedId }, 0, 0);
            mContainerId = a.getResourceId(0, 0);
            a.recycle();
    
            super.setOnTabChangedListener(this);
        }
    
        private void ensureHierarchy(Context context) {
            // If owner hasn't made its own view hierarchy, then as a convenience
            // we will construct a standard one here.
            if (findViewById(android.R.id.tabs) == null) {
                LinearLayout ll = new LinearLayout(context);
                ll.setOrientation(LinearLayout.VERTICAL);
                addView(ll, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    
                TabWidget tw = new TabWidget(context);
                tw.setId(android.R.id.tabs);
                tw.setOrientation(TabWidget.HORIZONTAL);
                ll.addView(tw, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0));
    
                FrameLayout fl = new FrameLayout(context);
                fl.setId(android.R.id.tabcontent);
                ll.addView(fl, new LinearLayout.LayoutParams(0, 0, 0));
    
                mRealTabContent = fl = new FrameLayout(context);
                mRealTabContent.setId(mContainerId);
                ll.addView(fl, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 1));
            }
        }
    
        /**
         * @deprecated Don't call the original TabHost setup, you must instead call
         *             {@link #setup(Context, FragmentManager)} or
         *             {@link #setup(Context, FragmentManager, int)}.
         */
        @Override
        @Deprecated
        public void setup() {
            throw new IllegalStateException("Must call setup() that takes a Context and FragmentManager");
        }
    
        public void setup(Context context, FragmentManager manager) {
            ensureHierarchy(context); // Ensure views required by super.setup()
            super.setup();
            mContext = context;
            mFragmentManager = manager;
            ensureContent();
        }
    
        public void setup(Context context, FragmentManager manager, int containerId) {
            ensureHierarchy(context); // Ensure views required by super.setup()
            super.setup();
            mContext = context;
            mFragmentManager = manager;
            mContainerId = containerId;
            ensureContent();
            mRealTabContent.setId(containerId);
    
            // We must have an ID to be able to save/restore our state. If
            // the owner hasn't set one at this point, we will set it ourself.
            if (getId() == View.NO_ID) {
                setId(android.R.id.tabhost);
            }
        }
    
        private void ensureContent() {
            if (mRealTabContent == null) {
                mRealTabContent = (FrameLayout) findViewById(mContainerId);
                if (mRealTabContent == null) {
                    throw new IllegalStateException("No tab content FrameLayout found for id " + mContainerId);
                }
            }
        }
    
        @Override
        public void setOnTabChangedListener(OnTabChangeListener l) {
            mOnTabChangeListener = l;
        }
    
        public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {
            tabSpec.setContent(new DummyTabFactory(mContext));
            String tag = tabSpec.getTag();
    
            TabInfo info = new TabInfo(tag, clss, args);
    
            if (mAttached) {
                // If we are already attached to the window, then check to make
                // sure this tab's fragment is inactive if it exists. This shouldn't
                // normally happen.
                info.fragment = mFragmentManager.findFragmentByTag(tag);
                if (info.fragment != null && !info.fragment.isDetached()) {
                    FragmentTransaction ft = mFragmentManager.beginTransaction();
                    //                ft.detach(info.fragment);
                    ft.hide(info.fragment);
                    ft.commit();
                }
            }
    
            mTabs.add(info);
            addTab(tabSpec);
        }
    
        @Override
        protected void onAttachedToWindow() {
            super.onAttachedToWindow();
    
            String currentTab = getCurrentTabTag();
    
            // Go through all tabs and make sure their fragments match
            // the correct state.
            FragmentTransaction ft = null;
            for (int i = 0; i < mTabs.size(); i++) {
                TabInfo tab = mTabs.get(i);
                tab.fragment = mFragmentManager.findFragmentByTag(tab.tag);
                //            if (tab.fragment != null && !tab.fragment.isDetached()) {
                if (tab.fragment != null) {
                    if (tab.tag.equals(currentTab)) {
                        // The fragment for this tab is already there and
                        // active, and it is what we really want to have
                        // as the current tab. Nothing to do.
                        mLastTab = tab;
                    } else {
                        // This fragment was restored in the active state,
                        // but is not the current tab. Deactivate it.
                        if (ft == null) {
                            ft = mFragmentManager.beginTransaction();
                        }
                        //                    ft.detach(tab.fragment);
                        ft.hide(tab.fragment);
                    }
                }
            }
    
            // We are now ready to go. Make sure we are switched to the
            // correct tab.
            mAttached = true;
            ft = doTabChanged(currentTab, ft);
            if (ft != null) {
                ft.commit();
                mFragmentManager.executePendingTransactions();
            }
        }
    
        @Override
        protected void onDetachedFromWindow() {
            super.onDetachedFromWindow();
            mAttached = false;
        }
    
        @Override
        protected Parcelable onSaveInstanceState() {
            Parcelable superState = super.onSaveInstanceState();
            SavedState ss = new SavedState(superState);
            ss.curTab = getCurrentTabTag();
            return ss;
        }
    
        @Override
        protected void onRestoreInstanceState(Parcelable state) {
            SavedState ss = (SavedState) state;
            super.onRestoreInstanceState(ss.getSuperState());
            setCurrentTabByTag(ss.curTab);
        }
    
        @Override
        public void onTabChanged(String tabId) {
            if (mAttached) {
                FragmentTransaction ft = doTabChanged(tabId, null);
                if (ft != null) {
                    ft.commit();
                }
            }
            if (mOnTabChangeListener != null) {
                mOnTabChangeListener.onTabChanged(tabId);
            }
        }
    
        private FragmentTransaction doTabChanged(String tabId, FragmentTransaction ft) {
            TabInfo newTab = null;
            for (int i = 0; i < mTabs.size(); i++) {
                TabInfo tab = mTabs.get(i);
                if (tab.tag.equals(tabId)) {
                    newTab = tab;
                }
            }
            if (newTab == null) {
                throw new IllegalStateException("No tab known for tag " + tabId);
            }
            if (mLastTab != newTab) {
                if (ft == null) {
                    ft = mFragmentManager.beginTransaction();
                }
                if (mLastTab != null) {
                    if (mLastTab.fragment != null) {
                        //                    ft.detach(mLastTab.fragment);
                        ft.hide(mLastTab.fragment);
                    }
                }
                if (newTab != null) {
                    if (newTab.fragment == null) {
                        newTab.fragment = Fragment.instantiate(mContext, newTab.clss.getName(), newTab.args);
                        ft.add(mContainerId, newTab.fragment, newTab.tag);
                    } else {
                        //                    ft.attach(newTab.fragment);
                        ft.show(newTab.fragment);
                    }
                }
    
                mLastTab = newTab;
            }
            return ft;
        }
    }

     or,Fragment deal

     使用FragmentTabHost时,Fragment之间切换时每次都会调用onCreateView方法,导致每次Fragment的布局都重绘,无法保持Fragment原有状态。

            解决办法:在Fragment onCreateView方法中缓存View

    private View rootView;//缓存Fragment view  
          
        @Override  
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
            if(rootView==null){  
                rootView=inflater.inflate(R.layout.tab_fragment, null);  
            }  
     //缓存的rootView需要判断是否已经被加过parent, 如果有parent需要从parent删除,要不然会发生这个rootview已经有parent的错误。  
            ViewGroup parent = (ViewGroup) rootView.getParent();  
            if (parent != null) {  
                parent.removeView(rootView);  
            }   
            return rootView;  
        }  
  • 相关阅读:
    总体和样本
    素数和合数
    Scrum 体验活动笔记
    敏捷 扑克上的时间估算(转)
    Python爬取拉勾网职位
    无头浏览器Chromedriver、Phantomjs安装及教程、Chrome插件xpath下载及安装
    Python爬取智联招聘职位信息
    MATLAB 信号与系统
    Python爬虫学习(2)- Ajax的Get、Post方法实战
    Python爬虫学习(1)
  • 原文地址:https://www.cnblogs.com/niray/p/4007799.html
Copyright © 2011-2022 走看看