FragmentPagerAdapter+ViewPager+Toolbar实现顶部多页签滑动

本文详细介绍了如何在Android应用中使用ViewPager与FragmentPagerAdapter结合Fragment实现动态切换内容的效果,包括代码配置、自定义FragmentPagerAdapter和Fragment的过程,以及如何利用Toolbar替代ActionBar进行页面头部定制。

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

效果图

在这里插入图片描述在这里插入图片描述

使用控件介绍

  • ViewPager作为容器可以存放View,在使用中通过setAdapter(PagerAdapter)来设置适配器。
  • FragmentPagerAdapter继承PagerAdapter,根据名称可知为ViewPager适配Fragment。
  • Toolbar用来替代ActionBar

代码讲解

  • 在build.gradle(app)添加依赖
implementation 'com.android.support:design:28.0.0'
  • 在sytle.xml中替代Actionbar
 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
   </style>

将上面parent替换成
Theme.AppCompat.Light.NoActionBar

  • MainActivity的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".MainActivity"
    android:orientation="vertical">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/Theme.AppCompat.Light"/>
    <android.support.design.widget.TabLayout
        android:id="@+id/tl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"></android.support.v4.view.ViewPager>
</LinearLayout>
  • 自定义FragmentPagerAdapter
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {

    //页签list
    private List<String> titleList;
    private List<Fragment> fragmentList;

    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    public MyFragmentPagerAdapter(FragmentManager fm, List<String> titleList,List<Fragment>fragmentList) {
        super(fm);
        this.titleList=titleList;
        this.fragmentList=fragmentList;
    }

    //得到对应的fragment
    @Override
    public Fragment getItem(int i) {
        return fragmentList.get(i);
    }

    //返回碎片个数
    @Override
    public int getCount() {
        return fragmentList.size();
    }

    //返回页签内容
    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return titleList.get(position);

    }
}
  • 自定义Fragment
public class MyFragment extends Fragment {

    //显示文本内容,来区别不同的fragment
    private TextView tv_content;
    private String content;

    public MyFragment(){
        super();
    }

    //传递内容
    public void setTv_content(String content){
        this.content=content;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.myframent_layout,null);
        tv_content = (TextView) view.findViewById(R.id.tv_content);
        tv_content.setText(content);
        return view;
    }
}
  • 菜单布局文件
    在res资源目录下新建menu目录,并在menu目录下新建topmenu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item android:id="@+id/search"
        android:icon="@drawable/search"
        app:showAsAction="never"
        android:title="search"/>

    <item android:id="@+id/load"
        android:title="load"
        android:icon="@drawable/load"
        app:showAsAction="never" />

    <item android:id="@+id/delete"
        android:title="delete"
        android:icon="@drawable/delete"
        app:showAsAction="never"/>
</menu>

其中showAsAction属性代表显示方式:
always:总是显示
ifRoom:屏幕不够显示在菜单中
never:一致显示在菜单中

  • MainActivity代码
public class MainActivity extends AppCompatActivity {

    //页签list
    private List<String> titleList=new ArrayList<>();
    //碎片list
    private List<Fragment> fragmentList=new ArrayList<>();

    private ViewPager viewPager;
    private Toolbar toolbar;
    //用来绑定viewpager
    private TabLayout tabLayout;

    private MyFragmentPagerAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        initView();
        //初始化数据
        initData();

    }

    private void initView() {
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        tabLayout=findViewById(R.id.tl);

    }

    private void initData() {
        for (int i=0;i<5;i++){
            titleList.add("标题"+i);
            MyFragment fragment=new MyFragment();
            fragment.setTv_content("内容"+i);
            fragmentList.add(fragment);
        }
        //使用Toolbar来替代了Actionbar
        setSupportActionBar(toolbar);
        //显示左侧返回箭头
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        adapter=new MyFragmentPagerAdapter(getSupportFragmentManager(),titleList,fragmentList);
        viewPager.setAdapter(adapter);
        //绑定viewPager
        tabLayout.setupWithViewPager(viewPager);
    }

    //创建menu
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.topmenu,menu);
        return true;
    }

    //处理按钮点击事件
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.delete:
                Toast.makeText(this,"删除",Toast.LENGTH_SHORT).show();
                break;
            case R.id.load:
                Toast.makeText(this,"加载",Toast.LENGTH_SHORT).show();
                break;
            case R.id.search:
                Toast.makeText(this,"搜索",Toast.LENGTH_SHORT).show();
                break;
        }
        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        //使菜单上图标可见
        if (menu != null && menu instanceof MenuBuilder) {
            //编sdk版本24的情况 可以直接使用 setOptionalIconsVisible
            if (Build.VERSION.SDK_INT > 23) {
                MenuBuilder builder = (MenuBuilder) menu;
                builder.setOptionalIconsVisible(true);
            } else {
                //sdk版本24的以下,需要通过反射去执行该方法
                try {
                    MenuBuilder builder = (MenuBuilder) menu;
                    Method m = builder.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
                    m.setAccessible(true);
                    m.invoke(menu, true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return super.onPrepareOptionsMenu(menu);
    }
}

参考文章:
Toolbar 自定义及遇到的那些坑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值