实现广告条,采用ViewPager里嵌套fragment

本文展示了如何在Android应用中通过ViewPager嵌套Fragment来实现广告条的轮播功能。首先,提供了布局XML文件,包含一个ViewPager用于展示广告条。接着,创建了一个名为BanaerFragment的Fragment类,用于显示图片,并设置了接受外部传入图片资源的方法。然后,主活动(MainActivity)中初始化了ViewPager,设置了一个适配器(MyPagerAdapter),该适配器返回BanaerFragment实例并设置图片资源。此外,还实现了手动滑动和自动滑动的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.布局代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
>
   <!-- 实际上在不同的屏幕要进行适配-->
<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
   android:layout_height="140dp"></android.support.v4.view.ViewPager>
</RelativeLayout>
2.创建要嵌套的Fragment
public class BanaerFragment extends Fragment {

private int imgRes;
    public BanaerFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // 把一个布局资源变为view对象
        View view =inflater.inflate(R.layout.fragment_banaer, container, false);
        //查找布局中的控件
        ImageView imgShowBanaer = (ImageView) view.findViewById(R.id.imgShowBanaer);

        //为广告条设置加载图片资源
        imgShowBanaer.setImageResource(imgRes);
        return view;

    }

    //为这个fragment设置一个接收外界传来的图片资源,然后设置到fragment
    public  void setImage(int imgRes){
        this.imgRes =imgRes;
    }
}

布局代码
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:tools="http://schemas.android.com/tools"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             tools:context="com.zhiyuan3g.viewpagerdemo.fragment.BanaerFragment">

    <!-- TODO: Update blank fragment layout -->
    <!--首页广告条设置一个背景图片,当没有网络进行加载-->
 <ImageView
     android:id="@+id/imgShowBanaer"
     android:layout_width="match_parent"
     android:layout_height="140dp"/>

</FrameLayout>
3.主窗体代码
package com.zhiyuan3g.viewpagerdemo.activity;

import android.os.Bundle;
import android.os.Handler;
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.MotionEvent;
import android.view.View;

import com.zhiyuan3g.viewpagerdemo.R;
import com.zhiyuan3g.viewpagerdemo.fragment.BanaerFragment;

/**
 * 实现广告条,采用ViewPager里嵌套fragment,这样实现不是太好,容易造成oom(out of memory 内存溢出)
 * 广告条的高度要进行dimens适配,这里的广告条直接使用的是dp
 */
public class MainActivity extends AppCompatActivity {

    private ViewPager viewpager;

    //广告条的图片资源,如果是网上动态加载图片,这里要做修改,因为没有服务器资源,所以这个的资源是固定打的
    private int[] imgResId = {R.drawable.bg_1, R.drawable.bg_2, R.drawable.bg_3};
    //创建handler对象,主要是为了实现ViewPager的自动滑动
    private Handler handler new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        //ViewPager设置适配器
       viewpager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
        //实现ViewPager起始的页数 设定一个值,来实现左右滑动
       viewpager.setCurrentItem(5000);
        //调用封装的方法进行自动的滑动
        autoScroll();

        //ViewPager的监听器
       viewpager.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    //按下后
                   case MotionEvent.ACTION_DOWN:
                        handler.removeCallbacksAndMessages(null);
                        int currentItem = viewpager.getCurrentItem();
                        //在原有的页数上+1,就是下一页 然后跳到下一页从而在该死循环中实现自动换页的效果
                       viewpager.setCurrentItem(currentItem);
                        break;
                    case MotionEvent.ACTION_MOVE:
                        break;
                    //松开后
                   case MotionEvent.ACTION_UP:
                        autoScroll();
                        break;
                }
                return false;
            }
        });



    }

    public void autoScroll() {
        handler.postDelayed(new Runnable() {
            //使用此方法  第二个参数可以指定该方法在几秒后进行
           @Override
            public void run() {
                //获得当前页面的下标
               int currentItem = viewpager.getCurrentItem();
                //在原有的页数上+1,就是下一页 然后跳到下一页从而在该死循环中实现自动换页的效果
               viewpager.setCurrentItem(currentItem + 1);
                //再次使用postDelayed(this,2000)可以让run()里面的代码成为死循环
               handler.postDelayed(this2000);
            }
        }, 2000);
    }

    class MyPagerAdapter extends FragmentPagerAdapter {
        //自动复写一个构造方法,不用修改
       //注意 当viewPager设置适配器时,参数必须为FragmentManager
        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        //返回一个fragment的视图,类似于ListViewgetView方法,
        // position参数代表的吉局势ViewPager的页面位置
       @Override
        public Fragment getItem(int position) {
            //创建塞入ViewPagerfragment
            BanaerFragment banaerFragment = new BanaerFragment();
            //fragment设置加载图片
           //为了防止角标越界,这里取position的余数
            banaerFragment.setImage(imgResId[position % (imgResId.length)]);
            return banaerFragment;
        }

        //ViewPager滑动的次数
       @Override
        public int getCount() {
            return 100000;
        }
    }

    private void initView() {
        viewpager = (ViewPager) findViewById(R.id.viewpager);
    }
}

实现效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值