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

来源:互联网 发布:淘宝客白菜群软件 编辑:程序博客网 时间:2024/05/17 09:12

普通的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的使用:

这里写链接内容

0 0
原创粉丝点击