使用FragmentTabhost代替Tabhost onCreatView 每次都被調用

普通的FragmentTabhost 的使用, 但這種用法, 每次當切換到Fragment的時候,都會重新調用onCreatView, 有的時候是不需要的, 請看下面的方法,就不會每次被調用。
先來 Layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <FrameLayout
        android:id="@+id/main_aty_fragmentactivity"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1" />


    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:background="@color/view_color" />


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="55dp">




        <RadioGroup
            android:id="@+id/main_aty_tab_rg_menu"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/white"
            android:orientation="horizontal"
            android:paddingTop="5dp">


            <RadioButton
                android:id="@+id/tab_rb_index"
                style="@style/tab_rb_style"
                android:checked="true"
                android:drawableTop="@drawable/main_aty_index_ico"
                android:text="首頁" />


            <RadioButton
                android:id="@+id/tab_rb_active"
                style="@style/tab_rb_style"
                android:drawableTop="@drawable/main_aty_active_ico"
                android:text="活動" />


            <RadioButton
                android:id="@+id/tab_rb_order"
                style="@style/tab_rb_style"
                android:drawableTop="@drawable/main_aty_order_ico"
                android:text="我的" />


        </RadioGroup>


    </RelativeLayout>


    <!--<android.support.v4.app.FragmentTabHost-->
    <!--android:id="@+id/main_aty_tabHost"-->
    <!--android:layout_width="fill_parent"-->
    <!--android:layout_height="50dp"-->
    <!--android:visibility="gone" >-->


    <!--<FrameLayout-->
    <!--android:id="@+id/tabcontent"-->
    <!--android:layout_width="0dp"-->
    <!--android:layout_height="0dp"-->
    <!--android:layout_weight="0" />-->
    <!--</android.support.v4.app.FragmentTabHost>-->


</LinearLayout>

再看 TabActivity 中的

    private void initViewHost() {
        layoutInflater = LayoutInflater.from(this);


        mTabRg = (RadioGroup) findViewById(R.id.main_aty_tab_rg_menu);

        fragmentArray.add(new FragmentIndex());
        fragmentArray.add(new FragmentActive());
        fragmentArray.add(new FragmentCenter());

        FragmentTabAdapter tabAdapter = new FragmentTabAdapter(this, fragmentArray, R.id.main_aty_fragmentactivity, mTabRg);
        tabAdapter.setOnRgsExtraCheckedChangedListener(new FragmentTabAdapter.OnRgsExtraCheckedChangedListener() {
            @Override
            public void OnRgsExtraCheckedChanged(RadioGroup radioGroup, int checkedId, int index) {
                //todo 
            }
        });

        message_red_tips = (ImageView) findViewById(R.id.message_red_tips);
    }

最關鍵的部分是這裏 FragmentTabAdapter, 附上代碼:

package com.hanzi.chinaexpress.view;


import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.widget.RadioGroup;

import java.util.List;


public class FragmentTabAdapter implements RadioGroup.OnCheckedChangeListener {
    private List<Fragment> fragments; // 一個tab頁面對應一個Fragment
    private RadioGroup rgs; // 用於切換tab
    private FragmentActivity fragmentActivity; // Fragment所屬的Activity
    private int fragmentContentId; // Activity中所要被替換的區域的id

    private int currentTab; // 當前Tab頁面索引

    private OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener; // 用於讓調用者在切換tab時候增加新的功能

    public FragmentTabAdapter(FragmentActivity fragmentActivity, List<Fragment> fragments, int fragmentContentId, RadioGroup rgs) {
        this.fragments = fragments;
        this.rgs = rgs;
        this.fragmentActivity = fragmentActivity;
        this.fragmentContentId = fragmentContentId;

        // 默認顯示第一頁
        FragmentTransaction ft = fragmentActivity.getSupportFragmentManager().beginTransaction();
        ft.add(fragmentContentId, fragments.get(0));
        ft.commit();

        rgs.setOnCheckedChangeListener(this);


    }

    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
        for (int i = 0; i < rgs.getChildCount(); i++) {
            if (rgs.getChildAt(i).getId() == checkedId) {
                Fragment fragment = fragments.get(i);
                FragmentTransaction ft = obtainFragmentTransaction(i);

                getCurrentFragment().onPause(); // 暫停當前tab
//                getCurrentFragment().onStop(); // 暫停當前tab

                if (fragment.isAdded()) {
//                    fragment.onStart(); // 啓動目標tab的onStart()
                    fragment.onResume(); // 啓動目標tab的onResume()
                } else {
                    ft.add(fragmentContentId, fragment);
                }
                showTab(i); // 顯示目標tab
                ft.commit();

                // 如果設置了切換tab額外功能功能接口
                if (null != onRgsExtraCheckedChangedListener) {
                    onRgsExtraCheckedChangedListener.OnRgsExtraCheckedChanged(radioGroup, checkedId, i);
                }

            }
        }

    }

    /**
     * 切換tab
     *
     * @param idx
     */
    private void showTab(int idx) {
        for (int i = 0; i < fragments.size(); i++) {
            Fragment fragment = fragments.get(i);
            FragmentTransaction ft = obtainFragmentTransaction(idx);

            if (idx == i) {
                ft.show(fragment);
            } else {
                ft.hide(fragment);
            }
            ft.commit();
        }
        currentTab = idx; // 更新目標tab爲當前tab
    }

    /**
     * 獲取一個帶動畫的FragmentTransaction
     *
     * @param index
     * @return
     */
    private FragmentTransaction obtainFragmentTransaction(int index) {
        FragmentTransaction ft = fragmentActivity.getSupportFragmentManager().beginTransaction();
        // 設置切換動畫
//        if (index > currentTab) {
//            ft.setCustomAnimations(R.anim.slide_left_in, R.anim.slide_left_out);
//        } else {
//            ft.setCustomAnimations(R.anim.slide_right_in, R.anim.slide_right_out);
//        }
        return ft;
    }

    public int getCurrentTab() {
        return currentTab;
    }

    public Fragment getCurrentFragment() {
        return fragments.get(currentTab);
    }

    public OnRgsExtraCheckedChangedListener getOnRgsExtraCheckedChangedListener() {
        return onRgsExtraCheckedChangedListener;
    }

    public void setOnRgsExtraCheckedChangedListener(OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener) {
        this.onRgsExtraCheckedChangedListener = onRgsExtraCheckedChangedListener;
    }

    /**
     * 切換tab額外功能功能接口
     */
    static class OnRgsExtraCheckedChangedListener {
        public void OnRgsExtraCheckedChanged(RadioGroup radioGroup, int checkedId, int index) {

        }
    }

}

另外附上普通的 FragmentTabhost的使用:

這裏寫鏈接內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章