一、前言:
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