一培他、前言:
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<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個數(shù)會初始化當前的Fragment和下一個Fragment,往回滑會初始化上一個Fragment.
//2.如果設置了setOffscreenPageLimit的個數(shù)(不管是幾)所有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>
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<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>
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個數(shù)會初始化當前的Fragment和下一個Fragment,往回滑會初始化上一個Fragment.
* 如果設置了setOffscreenPageLimit的個數(shù)(不管是幾)所有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>
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,然后往后滑動一個執(zhí)行下一個,只執(zhí)行一次,往回滑不執(zhí)行
*/
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("手環(huán)");
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關聯(lián)起來逃沿。
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) {
//如果注釋這行婴渡,那么不管怎么切換,page都不會被銷毀
//super.destroyItem(container, position, 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>
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