关于ViewPager和Fragment的使用初级。适合初学者

使用的ViewPager是android.support.v4.包下的。

demo one:

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.ImageView;

public class MainActivity extends Activity {
    // 做图片轮播
    // 准备视图资源
    List<ImageView> list = new ArrayList<ImageView>();
    // 准备pageadapter
    // 声明viewpager
    private ViewPager mVp;
    private MyPageAdapter adapter;
    
    private Handler handler=new Handler(){
        public void handleMessage(Message msg) {
            //执行viewpage切换
            mVp.setCurrentItem(msg.what);
            
        };
    };
    int index=0;//切换所需要提供的下标
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mVp = (ViewPager) findViewById(R.id.vp);
        // 准备图片资源
        for (int i = 0; i < 4; i++) {
            ImageView img = new ImageView(this);
            img.setImageResource(R.drawable.ic_launcher);
            list.add(img);
        }
        //声明适配器绑定资源
        adapter=new MyPageAdapter();
        mVp.setAdapter(adapter);
        //viewpager 实现自动的轮播
        //启用一个线程不断给handler
        //发送请求由handler做切换的媒体
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                while (true) {
                    //定时发送handler
                    SystemClock.sleep(3000);
                    index++;
                    if(index>list.size()){
                        index=0;
                    }

                    handler.sendEmptyMessage(index);
                    
                }

                
            }
        }).start();

    }

    // 准备适配器
    class MyPageAdapter extends PagerAdapter {

        @Override // 强制重写--切换视图的数量
        public int getCount() {
            return list.size();
        }

        @Override // 强制重写--判断页面死否为同一资源
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == arg1;
        }

        // 重写两个非抽象方法(重要)
        @Override//  页面销毁调用
        public void destroyItem(ViewGroup container, int position, Object object) {
            // super.destroyItem(container, position, object);
            container.removeView(list.get(position));
        }

        @Override //页面缓存调用
        public Object instantiateItem(ViewGroup container, int position) {
            //return super.instantiateItem(container, position);
            //得到要切换的视图
            ImageView img=list.get(position);
            //要切换的视图添加到container
            container.addView(img);
            //返回获得视图
            return  img;
        }

    }

}

基本的逻辑思路:

在布局文件中创建布局文件并添加ViewPager

上例中只简单的显示图片,所以ViewPager中直接 使用Imageview控件。创建一个集合用于保存在ViewPager中用到的Imageview,初始化时

new Imageview 并添加到集合中以供在ViewPager中使用,准备适配器使用继承PagerAdapter,其中自动生成两个抽象方法需要重写。另外需要手动添加

两个非抽象方法public void destroyItem(ViewGroup container, int position, Object object)此方法是当页面销毁时调用, 以及public Object instantiateItem(ViewGroup container, int position)此方法当页面缓存时调用。实现图片的轮播启动一个工作线程,在此线程中执行耗时操作休眠,然后通过消息发送传递给主线程,在主线程中执行

ViewPager的setCurrentItem()方法更新界面。

Fragment就是通常所说的碎片,是现在比较流行的一种功能。使用时可以将其比作一个Activity。一般创建一个新的碎片继承Fragment,并重写其中的onCreatView方法,

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // 得到视图
        View v=inflater.inflate(R.layout.two_f, null);
        return v;
    }
在这个方法中得到视图    ,其中的第一个参数是一个页面布局,布局中可以添加你想要的控件等等。
import android.os.Bundle;
import android.view.View;
import android.app.Activity;

public class MainActivity extends Activity {
    //准备碎片管理器
    private android.app.FragmentManager man;
    //准备碎片的处理事务
    private android.app.FragmentTransaction  tra;
    OneFragmnet one;
    TwoFragmnet two;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //创建切换碎片的对象
        one =new OneFragmnet();
         two =new TwoFragmnet();
        //管理器
        man=getFragmentManager();
        //事务初始化
        tra=man.beginTransaction();
        tra.replace(R.id.fl, one);
        //事务使用时候如何执行
        tra.commit();
    }

    public void doClick(View v){
        
        switch (v.getId()) {
        case R.id.button1:
            tra=man.beginTransaction();
            tra.replace(R.id.fl, one);
            break;
        case R.id.button2:
            tra=man.beginTransaction();
            tra.replace(R.id.fl, two);
            break;

        }
        tra.commit();
    }
   
}

在这里我们要使用到FragmentManager这个管理者和FragmentTransaction这个处理事务。而同时在Activity的布局文件中使用了Framelayout,作为

Fragment的载体。

下面我们来说说ViewPager与Fragment的连用:

基本思路是将ViewPager作为容器,将碎片添加到容器中。

注意这里为ViewPager配置的适配器不再是PagerAdapter而是FragmentPagerAdapter了。

public class MainActivity extends FragmentActivity {
    //用于存储切换的碎片
    private List<Fragment> list=new ArrayList<Fragment>();
    //准备适配器
    private  FragmentPagerAdapter adapter;
    private ViewPager mVp;
    private RadioGroup mRg;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         init();
         setAdapter();
        Linten();
        
    }

    /**
     * 处理初始化相关问题
     */
    public void init(){
        HotFragment hot=new HotFragment();
        NewFragment ne=new NewFragment();
        //数据的添加
        list.add(hot);
        list.add(ne);
        mVp=(ViewPager) findViewById(R.id.vp);
        mRg=(RadioGroup) findViewById(R.id.rg);
    }
    
    /**
     * 处理适配器绑定
     */
    public void setAdapter(){
        //通过内部类形式获取适配器
        adapter=new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public int getCount() {
                return list.size();
            }
            @Override
            public Fragment getItem(int arg0) {
                return list.get(arg0);
            }
        };
        
        mVp.setAdapter(adapter);
    }
/**
 * 处理监听事件
 */
public void  Linten(){
    //radio按钮监听
    
    mRg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            
            switch (checkedId) {
            case R.id.rb_hot:
                mVp.setCurrentItem(0);
                break;
            case R.id.rb_new:
                mVp.setCurrentItem(1);
                break;
            }
        }
    });
    
   
        
        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {    
        }      //hushi
        
        @Override
        public void onPageScrollStateChanged(int arg0) {
            //hushi
        }
    });
    
    
    
}
    
    
    //采用继承类方式获得适配器
//    class myFr extends FragmentPagerAdapter{
//
//        public myFr(FragmentManager fm) {
//            super(fm);
//            // TODO Auto-generated constructor stub
//        }
//
//        @Override
//        public Fragment getItem(int arg0) {
//            // TODO Auto-generated method stub
//            return null;
//        }
//
//        @Override
//        public int getCount() {
//            // TODO Auto-generated method stub
//            return 0;
//        }
//        
//    }

}

这里的Activity是继承自FragmentActivity,我们需要创建一个集合来储存Fragment,为ViewPager配置适配器来显示Fragment。在适配器中

重写抽象方法即可。另外还添加了RadioButton的监听事件。这个只是随便添加的啦,哈哈。

另另外,
    //viewpager添加监听
    mVp.setOnPageChangeListener(new OnPageChangeListener() {
        
        @Override
        public void onPageSelected(int arg0) {
            switch (arg0) {
            case 0://切的热歌
                mRg.check(R.id.rb_hot);
                break;
            case 2://切的新歌
                mRg.check(R.id.rb_new);
                break;

            
            }
            
        }
       
这里是为ViewPager配置了监听,当当前的ViewPager上的碎片Fragment改变时,相应的Radiobutton会被随之选中。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为您讲解关于Android中ViewPager和Fragment使用ViewPager和Fragment是Android中非常常用的组件,他们可以一起使用来实现滑动页面效果。ViewPager是一个可以左右滑动切换页面的布局容器,而Fragment作为ViewPager的子页面,可以在ViewPager中进行动态添加和移除。 下面我们将分别介绍ViewPager和Fragment使用。 ## ViewPager的使用 ### 1.布局文件 在布局文件中,我们需要使用ViewPager作为容器,将需要滑动切换的页面放入其中。如下所示: ``` <androidx.viewpager.widget.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` ### 2.创建Adapter 我们需要创建一个Adapter继承自PagerAdapter,并重写以下方法: ``` public class MyPagerAdapter extends PagerAdapter { private List<Fragment> mFragments; public MyPagerAdapter(List<Fragment> fragments) { mFragments = fragments; } @Override public int getCount() { return mFragments.size(); } @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view == object; } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { Fragment fragment = mFragments.get(position); container.addView(fragment.getView()); return fragment.getView(); } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { container.removeView((View) object); } } ``` ### 3.设置Adapter 在Activity或Fragment中,我们需要创建ViewPager的实例,并设置Adapter。如下所示: ``` ViewPager viewPager = findViewById(R.id.viewPager); List<Fragment> fragments = new ArrayList<>(); fragments.add(new Fragment1()); fragments.add(new Fragment2()); fragments.add(new Fragment3()); MyPagerAdapter adapter = new MyPagerAdapter(fragments); viewPager.setAdapter(adapter); ``` 这样,我们就完成了ViewPager的使用。 ## Fragment使用 ### 1.创建Fragment 我们需要创建一个继承自Fragment的类,并重写以下方法: ``` public class Fragment1 extends Fragment { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment1, container, false); return view; } } ``` ### 2.布局文件 我们需要在Fragment中添加布局文件,如下所示: ``` <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="Fragment1" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> ``` 这样,我们就完成了Fragment使用。 ## ViewPager和Fragment的结合使用 通过以上介绍,我们已经知道了如何使用ViewPager和Fragment了。现在我们需要将它们结合起来使用。 ### 1.创建Fragment 我们需要创建多个Fragment作为ViewPager的子页面。 ### 2.创建Adapter 我们需要创建一个PagerAdapter,将Fragment添加到ViewPager中。如上所示,我们已经创建了一个MyPagerAdapter。 ### 3.设置Adapter 在Activity或Fragment中,我们需要创建ViewPager的实例,并设置Adapter。如上所示,我们已经使用ViewPager的setAdapter方法设置了MyPagerAdapter。 这样,我们就完成了ViewPager和Fragment的结合使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值