本篇接上篇 android碎片简易实现方法(Fragment)请先去看看这一篇吧!
上篇地址:http://blog.youkuaiyun.com/weixin_41454168/article/details/79557273
上篇实现的Fragment只能点击不能侧滑,本篇换一种实现方法,实现点击与侧滑两种效果
本篇与上篇的区别,都在于 Activity 和 它关联的 xml 布局
1、在 Activity 的 xml 布局中 FrameLayout 改为 android.support.v4.view.ViewPager
2、写一个 Fragment 与 ViewPager 的适配器
3、Activity 中对于 Fragment 各个界面的控制方法的改变
代码详解:
1、在 Activity 的 xml 布局中 FrameLayout 改为 android.support.v4.view.ViewPager
将上篇中的碎片布局容器改为:(在 activity_main.xml 中)
<android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" />
2、写一个 Fragment 与 ViewPager 的适配器
适配器 MyViewPagerAdapter 将在 MainActivity 中调用适配
import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.util.Log; import java.util.List; /** * Created by Administrator on 2017/12/20 0020. * Fragment 视图管理适配器 */ public class MyViewPagerAdapter extends FragmentPagerAdapter { private List<Fragment> list; public MyViewPagerAdapter(FragmentManager fm, List<Fragment> list) { super(fm); this.list = list; Log.e("TAG",list.size()+""); } @Override public Fragment getItem(int position) { return list.get(position); } @Override public int getCount() { return list.size(); } }
3、Activity 中对于 Fragment 各个界面的控制方法的改变
实现方法换了一种,改动较大,具体请看代码
import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.os.Bundle; import android.view.View; import android.widget.RadioButton; import com.win.fragmentslip.fragment.FiveFragment; import com.win.fragmentslip.fragment.FourFragment; import com.win.fragmentslip.fragment.OneFragment; import com.win.fragmentslip.fragment.ThreeFragment; import com.win.fragmentslip.fragment.TwoFragment; import java.util.ArrayList; import java.util.List; //需要继承 FragmentActivity 实现 ViewPager.OnPageChangeListener 接口 public class MainActivity extends FragmentActivity implements View.OnClickListener,ViewPager.OnPageChangeListener{ private ViewPager viewPager; //碎片布局容器 private RadioButton mHomeRb, mSleepRb, mStatisticsRb,mFindRb, mMySelfRb; //碎片的五个按钮 private RadioButton[] rbs; //碎片布局 private OneFragment oneFragment; private TwoFragment twoFragment; private ThreeFragment threeFragment; private FourFragment fourFragment; private FiveFragment fiveFragment; //用来存放 Fragment private List<Fragment> listFragment = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); initData(); } public void init(){ viewPager = (ViewPager) findViewById(R.id.viewPager); mHomeRb = (RadioButton) findViewById(R.id.home_rb); mSleepRb = (RadioButton) findViewById(R.id.sleep_rb); mStatisticsRb = (RadioButton) findViewById(R.id.Statistics_rb); mFindRb = (RadioButton) findViewById(R.id.find_rb); mMySelfRb = (RadioButton) findViewById(R.id.myself_rb); mHomeRb.setOnClickListener(this); mSleepRb.setOnClickListener(this); mStatisticsRb.setOnClickListener(this); mFindRb.setOnClickListener(this); mMySelfRb.setOnClickListener(this); mHomeRb.setChecked(true); //设置默认显示的界面为 mHomeRb viewPager.setOnPageChangeListener(this); //设置导航图片的大小 rbs = new RadioButton[5]; rbs[0] = mHomeRb; rbs[1] = mSleepRb; rbs[2] = mStatisticsRb; rbs[3] = mFindRb; rbs[4] = mMySelfRb; for (RadioButton rb : rbs) { Drawable[] drs = rb.getCompoundDrawables(); Rect r = new Rect(0, 0, drs[1].getMinimumWidth() * 2 / 3 - 5, drs[1].getMinimumHeight() * 2 / 3 - 5); drs[1].setBounds(r); rb.setCompoundDrawables(null, drs[1], null, null); } } //将五个 Fragment 布局放在 listFragment 中,通过 adapter 放入碎片容器 viewPager 中 public void initData(){ oneFragment = new OneFragment(); twoFragment = new TwoFragment(); threeFragment = new ThreeFragment(); fourFragment = new FourFragment(); fiveFragment = new FiveFragment(); listFragment.add(oneFragment); listFragment.add(twoFragment); listFragment.add(threeFragment); listFragment.add(fourFragment); listFragment.add(fiveFragment); viewPager.setAdapter(new MyViewPagerAdapter(getSupportFragmentManager() , listFragment)); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } //监听到页面更改事件后,更改布局页面 @Override public void onPageSelected(int position) { switch (position) { case 0: mHomeRb.setChecked(true); break; case 1: mSleepRb.setChecked(true); break; case 2: mStatisticsRb.setChecked(true); break; case 3: mFindRb.setChecked(true); break; case 4: mMySelfRb.setChecked(true); break; } } @Override public void onPageScrollStateChanged(int state) { } //点击导航栏设置当前布局 (将布局更改为点击的。。) @Override public void onClick(View view) { switch (view.getId()){ case R.id.home_rb: viewPager.setCurrentItem(0,false); break; case R.id.sleep_rb: viewPager.setCurrentItem(1,false); break; case R.id.Statistics_rb: viewPager.setCurrentItem(2,false); break; case R.id.find_rb: viewPager.setCurrentItem(3,false); break; case R.id.myself_rb: viewPager.setCurrentItem(4,false); break; } } }
各个代码的作用都做出了备注,细心看看就知道了
最后提示:本篇需要结合源码或者上篇看才行
源码:https://github.com/iscopy/FragmentSlip