Fragment常见的几种切换方式

第一种情况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<Fragment> mFragments=new ArrayList<Fragment>();
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();
    }

}}

布局文件

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

<android.support.v4.view.ViewPager
    android:id="@+id/content_fl"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"></android.support.v4.view.ViewPager>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="30dp">

    <ImageView
        android:id="@+id/iv_1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:layout_gravity="center"
        android:src="@drawable/select_home"/>

    <ImageView
        android:id="@+id/iv_2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:src="@drawable/select_bracel"/>

    <ImageView
        android:id="@+id/iv_3"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:src="@drawable/select_mine"/>

    <ImageView
    android:id="@+id/iv_4"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:src="@drawable/select_mine2"/>

</LinearLayout>
</LinearLayout>

第二种情况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<Fragment> mFragments=new ArrayList<Fragment>();
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();
}
}

布局文件

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

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

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="30dp">

    <ImageView
        android:id="@+id/iv_1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:layout_gravity="center"
        android:src="@drawable/select_home"/>

    <ImageView
        android:id="@+id/iv_2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:src="@drawable/select_bracel"/>

    <ImageView
        android:id="@+id/iv_3"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:src="@drawable/select_mine"/>

    <ImageView
    android:id="@+id/iv_4"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:src="@drawable/select_mine2"/>

</LinearLayout>
</LinearLayout>

第三种情况使用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<Fragment> mFragments=new ArrayList<Fragment>();
//    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();
    }

}*/
}

布局文件

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

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

<android.support.design.widget.BottomNavigationView
    android:id="@+id/navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    app:itemBackground="@color/safe_mode_text"
    app:menu="@menu/navigation" />

</LinearLayout>

第四种情况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<String> 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<Fragment> 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<String> mTitles;
    private List<Fragment> info;

    public FragmentAdapter(FragmentManager fm, List<Fragment> info, List<String> 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) {

    }
}
}

布局文件

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


<android.support.design.widget.TabLayout
    android:id="@+id/tabs"
    android:layout_width="match_parent"
    android:layout_height="45dp"
    android:paddingRight="15dp"
    android:paddingLeft="15dp"
    android:background="#ffffff"
    app:tabIndicatorColor="#FF972F"
    app:tabSelectedTextColor="#F6AE37"
    app:tabTextColor="#A3A3A3"
    app:tabIndicatorHeight="4dp"
    app:tabTextAppearance="@android:style/TextAppearance.Holo.Medium"/>

<android.support.v4.view.ViewPager
    android:id="@+id/content_vp"
    android:background="#f2f2f2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</LinearLayout>

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

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;

/**
* Created by Administrator on 2018-04-22.
*/

@ContentView(R.layout.fragment_home)
public class HomeFragment extends BaseFragment {

@ViewInject(R.id.tv_home)
private TextView tvhome;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    Log.v("txb","首页onCreateView");
    return super.onCreateView(inflater, container, savedInstanceState);
}
}

猜你喜欢

转载自blog.csdn.net/qq_34581102/article/details/81100763
今日推荐