Android碎片实现,可点击、侧滑更改碎片布局

本文介绍了一种在Android应用中实现Fragment侧滑切换的方法。通过使用ViewPager替代FrameLayout,并配合自定义的FragmentPagerAdapter,实现了Fragment的点击与侧滑切换功能。文章详细介绍了布局文件的修改、适配器的编写及Activity中控制Fragment的代码实现。

本篇接上篇 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

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值