Fragment常见的几种切换方式

一、前言:

Fragment中常见的切换方式有 4 种,分别是:

  • 使用ViewPager滑动切换跟点击切换;
  • 使用FrameLayout点击切换;
  • 使用BottomNavigationView+ViewPager;
  • 使用TabLayout+ViewPager滑动点击切换;

二、使用:

1. ViewPager滑动切换跟点击切换

package jibaowang.com.myapplicationdemo;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import java.util.ArrayList;
/**
* 滑动切换Fragment
*/

public class MainActivity extends AppCompatActivity implements View.OnClickListener, ViewPager.OnPageChangeListener {

private ViewPager mContainerVp;
private ArrayList mFragments=new ArrayList();
private MyFragmentPagerAdapter adapter;
private ImageView iv_1;
private ImageView iv_2;
private ImageView iv_3;
private ImageView iv_4;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    iv_1=(ImageView) findViewById(R.id.iv_1);
    iv_2=(ImageView) findViewById(R.id.iv_2);
    iv_3=(ImageView) findViewById(R.id.iv_3);
    iv_4=(ImageView) findViewById(R.id.iv_4);
    iv_1.setOnClickListener(this);
    iv_2.setOnClickListener(this);
    iv_3.setOnClickListener(this);
    iv_4.setOnClickListener(this);

    mContainerVp=(ViewPager) findViewById(R.id.content_fl);
    adapter =new MyFragmentPagerAdapter(getSupportFragmentManager());
    mContainerVp.setAdapter(adapter);
    //1.如果ViewPager没有设置setOffscreenPageLimit个数会初始化当前的Fragment和下一个Fragment,往回滑会初始化上一个Fragment.
    //2.如果设置了setOffscreenPageLimit的个数(不管是几)所有Fragment会一次加载,来回滑动不会在初始化Fragment.
    mContainerVp.setOffscreenPageLimit(4);//Fragment一次加载,不会在初始化Fragment
    mContainerVp.setOnPageChangeListener(this);
    iv_1.setSelected(true);
}

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

@Override
public void onPageSelected(int position) {
    switch (position){
        case 0:
            iv_1.setSelected(true);
            iv_2.setSelected(false);
            iv_3.setSelected(false);
            iv_4.setSelected(false);
            break;
        case 1:
            iv_1.setSelected(false);
            iv_2.setSelected(true);
            iv_3.setSelected(false);
            iv_4.setSelected(false);
            break;
        case 2:
            iv_1.setSelected(false);
            iv_2.setSelected(false);
            iv_3.setSelected(true);
            iv_4.setSelected(false);
            break;
        case 3:
            iv_1.setSelected(false);
            iv_2.setSelected(false);
            iv_3.setSelected(false);
            iv_4.setSelected(true);
            break;
    }

}

@Override
public void onPageScrollStateChanged(int state) {

}


@Override
public void onClick(View view) {
    switch (view.getId()){
        case R.id.iv_1:
            mContainerVp.setCurrentItem(0);
            break;
        case R.id.iv_2:
            mContainerVp.setCurrentItem(1);
            break;
        case R.id.iv_3:
            mContainerVp.setCurrentItem(2);
            break;
        case R.id.iv_4:
            mContainerVp.setCurrentItem(3);
            break;
    }
}

class MyFragmentPagerAdapter extends FragmentPagerAdapter {

    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
        mFragments.add(new HomeFragment());
        mFragments.add(new BraceletFragment());
        mFragments.add(new MineFragment());
        mFragments.add(new MineFragment2());
    }

    @Override
    public Fragment getItem(int position) {
        return mFragments.get(position);
    }

    @Override
    public int getCount() {
        return mFragments.size();
    }

}}

布局文件








    

    

    

    




2. FrameLayout点击切换

package jibaowang.com.myapplicationdemo;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import java.util.ArrayList;
/**
* 点击切换的Fragment
* 点下面按钮初始化Fragment,只初始化一次,如果用replace就会每次都初始化Fragment
*
*/

public class MainActivity2 extends AppCompatActivity implements View.OnClickListener{

private ArrayList mFragments=new ArrayList();
private ImageView iv_1;
private ImageView iv_2;
private ImageView iv_3;
private ImageView iv_4;
private BaseFragment mFragmentContent;
private MineFragment2 mMineFragment2;
private MineFragment mMineFragment;
private BraceletFragment mBraceletFragment;
private HomeFragment mHomeFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    iv_1=(ImageView) findViewById(R.id.iv_1);
    iv_2=(ImageView) findViewById(R.id.iv_2);
    iv_3=(ImageView) findViewById(R.id.iv_3);
    iv_4=(ImageView) findViewById(R.id.iv_4);
    iv_1.setOnClickListener(this);
    iv_2.setOnClickListener(this);
    iv_3.setOnClickListener(this);
    iv_4.setOnClickListener(this);

    initFragment();
    iv_1.performClick();
}


private void switchContent(Fragment from, BaseFragment to) {
    if (mFragmentContent != to) {
        mFragmentContent = to;
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if (!to.isAdded()) { // 先判断是否被add过
            transaction.hide(from).add(R.id.content_fl, to).commit();
        } else {
            transaction.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个
        }
    }
}


@Override
public void onClick(View view) {
    switch (view.getId()){
        case R.id.iv_1:
            switchContent(mFragmentContent,mHomeFragment);
            iv_1.setSelected(true);
            iv_2.setSelected(false);
            iv_3.setSelected(false);
            iv_4.setSelected(false);
            break;
        case R.id.iv_2:
            switchContent(mFragmentContent,mBraceletFragment);
            iv_1.setSelected(false);
            iv_2.setSelected(true);
            iv_3.setSelected(false);
            iv_4.setSelected(false);
            break;
        case R.id.iv_3:
            switchContent(mFragmentContent,mMineFragment);
            iv_1.setSelected(false);
            iv_2.setSelected(false);
            iv_3.setSelected(true);
            iv_4.setSelected(false);
            break;
        case R.id.iv_4:
            switchContent(mFragmentContent,mMineFragment2);
            iv_1.setSelected(false);
            iv_2.setSelected(false);
            iv_3.setSelected(false);
            iv_4.setSelected(true);
            break;
    }
}

private void initFragment() {
    mHomeFragment = new HomeFragment();
    mBraceletFragment = new BraceletFragment();
    mMineFragment = new MineFragment();
    mMineFragment2 = new MineFragment2();
    mFragmentContent = mHomeFragment;//一定要赋值否则会报空指针
    getSupportFragmentManager().beginTransaction().add(R.id.content_fl, mHomeFragment).commit();
}
}

布局文件








    

    

    

    



3. 使用BottomNavigationView+ViewPager

package jibaowang.com.myapplicationdemo;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import java.util.ArrayList;

/**
* 使用BottomNavigationView+ViewPager
* 1.如果是结合ViewPager滑动使用
* 如果ViewPager没有设置setOffscreenPageLimit个数会初始化当前的Fragment和下一个Fragment,往回滑会初始化上一个Fragment.
* 如果设置了setOffscreenPageLimit的个数(不管是几)所有Fragment会一次加载,来回滑动不会在初始化Fragment.
*
* 2.如果结合FrameLayout点击切换使用
* 点下面按钮初始化Fragment,只初始化一次,如果用replace就会每次都初始化Fragment
*/

public class MainActivity3 extends AppCompatActivity {

private BottomNavigationView navigation;
private final int FRAGMENT_POSITION_HOME = 0;
private final int FRAGMENT_POSITION_BRACELET = 1;
private final int FRAGMENT_POSITION_MINE = 2;
private final int FRAGMENT_POSITION_MINE2 = 3;
private int tabPosition = 0;
private BaseFragment mFragmentContent;
private HomeFragment mHomeFragment;
private BraceletFragment mBraceletFragment;
private MineFragment mMineFragment;
private MineFragment2 mMineFragment2;
private ViewPager mContainerVp;
private ArrayList mFragments=new ArrayList();
//    private MyFragmentPagerAdapter adapter;
private MenuItem menuItem;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main3);
    navigation=(BottomNavigationView)findViewById(R.id.navigation);
    BottomNavigationViewHelper.disableShiftMode(navigation);
    navigation.setOnNavigationItemSelectedListener(mylistener);
//        mContainerVp=(ViewPager) findViewById(R.id.content_fl);
//        adapter =new MyFragmentPagerAdapter(getSupportFragmentManager());
//        mContainerVp.setAdapter(adapter);
//        mContainerVp.setOffscreenPageLimit(4);
//        mContainerVp.setOnPageChangeListener(this);
    initFragment();
}

private BottomNavigationView.OnNavigationItemSelectedListener mylistener= new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.menu_home:
                tabPosition = FRAGMENT_POSITION_HOME;
//                    mContainerVp.setCurrentItem(0);
                changeSelectTab(tabPosition);
                return true;
            case R.id.menu_bracelet:
                tabPosition = FRAGMENT_POSITION_BRACELET;
//                    mContainerVp.setCurrentItem(1);
                changeSelectTab(tabPosition);
                return true;
            case R.id.menu_mine:
                tabPosition = FRAGMENT_POSITION_MINE;
//                    mContainerVp.setCurrentItem(2);
                changeSelectTab(tabPosition);
                return true;
            case R.id.menu:
                tabPosition = FRAGMENT_POSITION_MINE2;
//                    mContainerVp.setCurrentItem(3);
                changeSelectTab(tabPosition);
                return true;
        }
        return false;
    }
};

private void changeSelectTab(int tabPosition) {
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    switch (tabPosition) {
        case FRAGMENT_POSITION_HOME:
            switchContent(mFragmentContent,mHomeFragment);
            break;
        case FRAGMENT_POSITION_BRACELET:
            switchContent(mFragmentContent,mBraceletFragment);
            break;
        case FRAGMENT_POSITION_MINE:
            switchContent(mFragmentContent,mMineFragment);
            break;
        case FRAGMENT_POSITION_MINE2:
            switchContent(mFragmentContent,mMineFragment2);
            break;
    }

    fragmentTransaction.commit();
}

private void switchContent(Fragment from, BaseFragment to) {
    if (mFragmentContent != to) {
        mFragmentContent = to;
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if (!to.isAdded()) { // 先判断是否被add过
            transaction.hide(from).add(R.id.content_fl, to).commit();
        } else {
            transaction.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个
        }
    }
}

private void initFragment() {
    mHomeFragment = new HomeFragment();
    mBraceletFragment = new BraceletFragment();
    mMineFragment = new MineFragment();
    mMineFragment2 = new MineFragment2();
    mFragmentContent = mHomeFragment;//一定要赋值否则会报空指针
    getSupportFragmentManager().beginTransaction().add(R.id.content_fl, mHomeFragment).commit();
}


/*    @Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

@Override
public void onPageSelected(int position) {
    if (menuItem != null) {
        menuItem.setChecked(false);
    } else {
        navigation.getMenu().getItem(0).setChecked(false);
    }
    menuItem = navigation.getMenu().getItem(position);
    menuItem.setChecked(true);
}

@Override
public void onPageScrollStateChanged(int state) {

}

class MyFragmentPagerAdapter extends FragmentPagerAdapter {

    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
        mFragments.add(new HomeFragment());
        mFragments.add(new BraceletFragment());
        mFragments.add(new MineFragment());
        mFragments.add(new MineFragment2());
    }

    @Override
    public Fragment getItem(int position) {
        return mFragments.get(position);
    }

    @Override
    public int getCount() {
        return mFragments.size();
    }

}*/
}

布局文件









4. TabLayout+ViewPager滑动点击切换

package jibaowang.com.myapplicationdemo;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
/**
* TabLayout+ViewPager滑动点击切换
* 进入会初始化当前的Fragment和下一个Fragment,然后往后滑动一个执行下一个,只执行一次,往回滑不执行
*/

public class MainActivity4 extends AppCompatActivity {


ViewPager mContentVp;
TabLayout mTabs;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main4);

    mContentVp = (ViewPager) findViewById(R.id.content_vp);
    mTabs = (TabLayout) findViewById(R.id.tabs);
    initFragment();
}

private void initFragment() {

    List titles = new ArrayList<>();
    titles.add("首页");
    titles.add("手环");
    titles.add("我的");
    titles.add("个人");

    for (int i = 0; i < titles.size(); i++) {
        mTabs.addTab(mTabs.newTab().setText(titles.get(i)));
    }

    ArrayList datas = new ArrayList<>();
    datas.add(new HomeFragment());
    datas.add(new BraceletFragment());
    datas.add(new MineFragment());
    datas.add(new MineFragment2());


    FragmentAdapter fragmentAdapter = new FragmentAdapter(getSupportFragmentManager(), datas, titles);
    mContentVp.setAdapter(fragmentAdapter);
    mContentVp.setCurrentItem(0);
    //将TabLayout和ViewPager关联起来。
    mTabs.setupWithViewPager(mContentVp);
    //给TabLayout设置适配器
    mTabs.setTabsFromPagerAdapter(fragmentAdapter);
}

class FragmentAdapter extends FragmentPagerAdapter {

    private final List mTitles;
    private List info;

    public FragmentAdapter(FragmentManager fm, List info, List titles) {
        super(fm);
        this.info = info;
        mTitles = titles;

    }


    @Override
    public Fragment getItem(int position) {
        return info.get(position);
    }

    @Override
    public int getCount() {
        return info.size();
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;

    }

    @Override
    public CharSequence getPageTitle(int position) {
        if (null == mTitles)
            return null;
        else
            return mTitles.get(position);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {

    }
}
}

布局文件










5. 附上页面中的几个Fragmen其中之一

package jibaowang.com.myapplicationdemo;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.ViewInject;


public class HomeFragment extends Fragment {


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.left_fragment, container,false);
        return view;
    }
}

原文链接:https://blog.csdn.net/qq_34581102/article/details/81100763

你可能感兴趣的:(Fragment常见的几种切换方式)