anroid Fragment优化与切换

xml布局如下:

<?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/mMainLayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <View
        android:layout_width="match_parent"
        android:layout_height="2px"
        android:background="@color/colorPrimary" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:orientation="horizontal">

        <LinearLayout
            android:id="@+id/ll_star"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/iv_star"
                android:layout_width="30dp"
                android:layout_height="30dp" />

            <TextView
                android:id="@+id/tv_star"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="星球"
                android:textColor="@android:color/white" />

        </LinearLayout>

        <LinearLayout
            android:id="@+id/ll_square"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/iv_square"
                android:layout_width="30dp"
                android:layout_height="30dp" />

            <TextView
                android:id="@+id/tv_square"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="广场"
                android:textColor="@android:color/white" />

        </LinearLayout>

        <LinearLayout
            android:id="@+id/ll_chat"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/iv_chat"
                android:layout_width="30dp"
                android:layout_height="30dp" />

            <TextView
                android:id="@+id/tv_chat"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="聊天"
                android:textColor="@android:color/white" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/ll_me"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/iv_me"
                android:layout_width="30dp"
                android:layout_height="30dp" />

            <TextView
                android:id="@+id/tv_me"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="我的"
                android:textColor="@android:color/white" />

        </LinearLayout>

    </LinearLayout>


</LinearLayout>
/*
*不会重新走生命周期,来回切换不会重新创建
*/
public class MainActivity extends BaseUIActivity implements View.OnClickListener{
    //星球
    private ImageView ivStar;
    private TextView tvStar;
    private LinearLayout llStar;
    private StarFragment mStarFragment=null;
    private FragmentTransaction mStartTransaction=null;
    //广场
    private LinearLayout llSquare;
    private ImageView ivSquare;
    private TextView tvSquare;
    private SquareFragment mSquareFragment=null;
    private FragmentTransaction mSquareTransaction=null;
    //聊天
    private LinearLayout llChat;
    private ImageView ivChat;
    private TextView tvChat;
    private ChatFragment mChatFragment=null;
    private FragmentTransaction mChatTransaction=null;
    //我的
    private LinearLayout llMe;
    private ImageView ivMe;
    private TextView tvMe;
    private MeFragment mMeFragment=null;
    private FragmentTransaction mMeTransaction=null;

    /**
     * 1.初始化Fragment
     * 2.显示Fragment
     * 3.隐藏Fragment
     * 4.回复Fragment
     * 优化的手段
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    /**
     * 初始化View
     */
    private void initView() {
        llStar = (LinearLayout) findViewById(R.id.ll_star);
        ivStar = (ImageView) findViewById(R.id.iv_star);
        tvStar = (TextView) findViewById(R.id.tv_star);
        llSquare = (LinearLayout) findViewById(R.id.ll_square);
        ivSquare = (ImageView) findViewById(R.id.iv_square);
        tvSquare = (TextView) findViewById(R.id.tv_square);
        llChat = (LinearLayout) findViewById(R.id.ll_chat);
        ivChat = (ImageView) findViewById(R.id.iv_chat);
        tvChat = (TextView) findViewById(R.id.tv_chat);
        llMe = (LinearLayout) findViewById(R.id.ll_me);
        ivMe = (ImageView) findViewById(R.id.iv_me);
        tvMe = (TextView) findViewById(R.id.tv_me);
        llChat.setOnClickListener(this);
        llStar.setOnClickListener(this);
        llSquare.setOnClickListener(this);
        llMe.setOnClickListener(this);
        //设置文本
        tvStar.setText("星球");
        tvSquare.setText("广场");
        tvChat.setText("聊天");
        tvMe.setText("我的");
        initFragment();//初始化Fragment
        //切换默认的选项卡
        checkMainTab(0);
    }

    /**
     * 初始化Fragment
     */
    private void initFragment() {
        //星球
        if (mStarFragment==null){
            mStarFragment=new StarFragment();
            mStartTransaction=getSupportFragmentManager().beginTransaction();
            mStartTransaction.add(R.id.mMainLayout,mStarFragment);
            mStartTransaction.commit();
        }
        //广场
        if (mSquareFragment==null){
            mSquareFragment=new SquareFragment();
            mSquareTransaction=getSupportFragmentManager().beginTransaction();
            mSquareTransaction.add(R.id.mMainLayout,mSquareFragment);
            mSquareTransaction.commit();
        }
        //聊天
        if (mChatFragment==null){
            mChatFragment=new ChatFragment();
            mChatTransaction=getSupportFragmentManager().beginTransaction();
            mChatTransaction.add(R.id.mMainLayout,mChatFragment);
            mChatTransaction.commit();
        }
        //我的
        if (mMeFragment==null){
            mMeFragment=new MeFragment();
            mMeTransaction=getSupportFragmentManager().beginTransaction();
            mMeTransaction.add(R.id.mMainLayout,mMeFragment);
            mMeTransaction.commit();
        }
    }

    /**
     * 显示Fragment
     * @param fragment
     */
    private void showFragment(Fragment fragment){
        if (fragment!=null){
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            hideAllFragment(transaction);//隐藏全部Fragment 
            transaction.show(fragment);
            transaction.commitAllowingStateLoss();
        }
    }

    /**
     * 隐藏所有的Fragment
     * @param transaction
     */
    private void hideAllFragment(FragmentTransaction transaction){
        if (mStarFragment!=null){
            transaction.hide(mStarFragment);
        }
        if (mSquareFragment!=null){
            transaction.hide(mSquareFragment);
        }
        if (mChatFragment!=null){
            transaction.hide(mChatFragment);
        }
        if (mMeFragment!=null){
            transaction.hide(mMeFragment);
        }
    }
    /**
     * 切换主页选项卡
     * @param index
     * 0:星球
     * 1:广场
     * 2:聊天
     * 3:我的
     */
    private void checkMainTab(int index){
        switch (index){
            case 0:
                showFragment(mStarFragment);
                //设置Tab切换图片
                ivStar.setImageResource(R.drawable.img_star_p);
                ivSquare.setImageResource(R.drawable.img_square);
                ivChat.setImageResource(R.drawable.img_chat);
                ivMe.setImageResource(R.drawable.img_me);
                //设置Tab文本颜色
                tvStar.setTextColor(Color.BLUE);
                tvSquare.setTextColor(Color.BLACK);
                tvChat.setTextColor(Color.BLACK);
                tvMe.setTextColor(Color.BLACK);
                break;
            case 1:
                showFragment(mSquareFragment);
                ivStar.setImageResource(R.drawable.img_star);
                ivSquare.setImageResource(R.drawable.img_square_p);
                ivChat.setImageResource(R.drawable.img_chat);
                ivMe.setImageResource(R.drawable.img_me);
                
                tvStar.setTextColor(Color.BLACK);
                tvSquare.setTextColor(Color.BLUE);
                tvChat.setTextColor(Color.BLACK);
                tvMe.setTextColor(Color.BLACK);
                break;
            case 2:
                showFragment(mChatFragment);
                ivStar.setImageResource(R.drawable.img_star);
                ivSquare.setImageResource(R.drawable.img_square);
                ivChat.setImageResource(R.drawable.img_chat_p);
                ivMe.setImageResource(R.drawable.img_me);
                
                tvStar.setTextColor(Color.BLACK);
                tvSquare.setTextColor(Color.BLACK);
                tvChat.setTextColor(Color.BLUE);
                tvMe.setTextColor(Color.BLACK);
                break;
            case 3:
                showFragment(mMeFragment);
                ivStar.setImageResource(R.drawable.img_star);
                ivSquare.setImageResource(R.drawable.img_square);
                ivChat.setImageResource(R.drawable.img_chat);
                ivMe.setImageResource(R.drawable.img_me_p);
                
                tvStar.setTextColor(Color.BLACK);
                tvSquare.setTextColor(Color.BLACK);
                tvChat.setTextColor(Color.BLACK);
                tvMe.setTextColor(Color.BLUE);
                break;
        }
    }

    /**
     * 防止重叠
     * 当应用的内存紧张的时候,系统会回收掉Fragment对象
     * 再一次进入的时候会重新创建Fragment
     * 非原来的对象,我们无法控制,导致重叠
     * @param fragment
     */
    @Override
    public void onAttachFragment(@NonNull @NotNull Fragment fragment) {
        if (mStarFragment!=null&&fragment instanceof StarFragment){
            mStarFragment= (StarFragment) fragment;
        }
        if (mSquareFragment!=null&&fragment instanceof SquareFragment){
            mSquareFragment= (SquareFragment) fragment;
        }
        if (mChatFragment!=null&&fragment instanceof ChatFragment){
            mChatFragment= (ChatFragment) fragment;
        }
        if (mMeFragment!=null&&fragment instanceof MeFragment){
            mMeFragment= (MeFragment) fragment;
        }
    }
    
    //点击事件
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.ll_star:
                checkMainTab(0);
                break;
            case R.id.ll_square:
                checkMainTab(1);
                break;
            case R.id.ll_chat:
                checkMainTab(2);
                break;
            case R.id.ll_me:
                checkMainTab(3);
                break;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值