在Android中使用ViewPager2 [英] Use of ViewPager2 in Android

查看:99
本文介绍了在Android中使用ViewPager2的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我开始了解 ViewPager2 并进行了尝试来实现它,但没有找到合适的例子。

I came to know about ViewPager2 and Tried to implement it but didn't found any proper example.

有人可以告诉我如何使用它。

Can anyone tell me how can I use it.

我在寻找提示,而不是示例。

I am looking for hint, not an example.

推荐答案

UPDATE 7



检查:从ViewPager迁移到ViewPager2

检查:使用标签创建滑动视图ViewPager2

签出我的答案,如果您想使用View Pager2实现Carousel


如何在ViewPager2中使用TabLayout

How to use TabLayout with ViewPager2

示例代码

以下使用依赖项

Use below dependencies

implementation 'com.google.android.material:material:1.1.0-alpha08'
implementation 'androidx.viewpager2:viewpager2:1.0.0-beta02'

示例代码


XMl布局

XMl layout



<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:layout_scrollFlags="scroll|enterAlways"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

        <com.google.android.material.tabs.TabLayout
                android:id="@+id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>
    </com.google.android.material.appbar.AppBarLayout>

    <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/viewpager"
            app:layout_anchor="@id/tabs"
            app:layout_anchorGravity="bottom"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
    />


</androidx.coordinatorlayout.widget.CoordinatorLayout>




活动

Activity



import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
import com.google.android.material.tabs.TabLayoutMediator

import com.google.android.material.tabs.TabLayout


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

//        setSupportActionBar(toolbar)
        viewpager.adapter = AppViewPagerAdapter(supportFragmentManager, lifecycle)

        TabLayoutMediator(tabs, viewpager, object : TabLayoutMediator.OnConfigureTabCallback {
            override fun onConfigureTab(tab: TabLayout.Tab, position: Int) {
                // Styling each tab here
                tab.text = "Tab $position"
            }
        }).attach()


    }
}




输出

带有ViewPager2的TabLayout

来自文档

ViewPager2


新功能

New features




  • 从右到左(RTL)布局支持

  • 垂直方向支持

  • notifyDataSetChanged完全可用


  • API更改

    API changes




    • FragmentStateAdapter 替换 FragmentStatePagerAdapter

    • RecyclerView.Adapter 替换 PagerAdapter

    • registerOnPageChangeCallback 替换 addPageChangeListener

      • FragmentStateAdapter replaces FragmentStatePagerAdapter
      • RecyclerView.Adapter replaces PagerAdapter
      • registerOnPageChangeCallback replaces addPageChangeListener
      • 示例代码


        添加最新的 依赖项 用于 ViewPager2



        implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha01'
        




        布局

        layout



        <?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"
            android:orientation="vertical"
            tools:context=".MainActivity">
        
            <androidx.viewpager2.widget.ViewPager2
                android:id="@+id/view_pager"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        
        </LinearLayout>
        




        活动

        activity



        import android.os.Bundle;
        import androidx.appcompat.app.AppCompatActivity;
        import androidx.viewpager2.widget.ViewPager2;
        
        import java.util.ArrayList;
        
        public class MyActivity extends AppCompatActivity {
        
            ViewPager2 myViewPager2;
            MyAdapter MyAdapter;
            private ArrayList<String> arrayList = new ArrayList<>();
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_my);
        
                myViewPager2 = findViewById(R.id.view_pager);
        
                arrayList.add("Item 1");
                arrayList.add("Item 2");
                arrayList.add("Item 3");
                arrayList.add("Item 4");
                arrayList.add("Item 5");
        
                MyAdapter = new MyAdapter(this, arrayList);
        
        
                myViewPager2.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
        
                myViewPager2.setAdapter(MyAdapter);
            }
        }
        




        MyAdapter

        MyAdapter



        import android.content.Context;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.ViewGroup;
        import android.widget.TextView;
        import androidx.annotation.NonNull;
        import androidx.recyclerview.widget.RecyclerView;
        
        import java.util.ArrayList;
        
        public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
        
            private Context context;
            private ArrayList<String> arrayList = new ArrayList<>();
        
            public MyAdapter(Context context, ArrayList<String> arrayList) {
                this.context = context;
                this.arrayList = arrayList;
            }
        
            @NonNull
            @Override
            public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
                return new MyViewHolder(view);
            }
        
            @Override
            public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
                holder.tvName.setText(arrayList.get(position));
            }
        
            @Override
            public int getItemCount() {
                return arrayList.size();
            }
        
            public class MyViewHolder extends RecyclerView.ViewHolder {
                TextView tvName;
        
                public MyViewHolder(@NonNull View itemView) {
                    super(itemView);
                    tvName = itemView.findViewById(R.id.tvName);
                }
            }
        }
        



        新功能



        New features


        现在我们需要使用 ViewPager2.OnPageChangeCallback() 来获取滑动事件 ViewPager2

        示例代码

            myViewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                    super.onPageScrolled(position, positionOffset, positionOffsetPixels);
                }
        
                @Override
                public void onPageSelected(int position) {
                    super.onPageSelected(position);
        
                    Log.e("Selected_Page", String.valueOf(position));
                }
        
                @Override
                public void onPageScrollStateChanged(int state) {
                    super.onPageScrollStateChanged(state);
                }
            });
        




        我们可以使用 myViewPager2.setOrientation设置方向()

        示例代码

        对于水平方向使用

        myViewPager2.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
        

        对于垂直方向使用

        myViewPager2.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
        




        我们可以使用 notifyDataSetChanged 与我们在 RecyclerView.Adapter


        $ b中使用的相同$ b

        添加新项目的示例代码

            btnAdd.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    arrayList.add("New ITEM ADDED");
                    MyAdapter.notifyDataSetChanged();
                }
            });
        

        示例代码以删除新项目

            btnRemove.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    arrayList.remove(3);
                    MyAdapter.notifyItemRemoved(3);
                }
            });
        



        UPDATE



        请尝试以下操作在 ViewPager2

        中使用 Fragment

        UPDATE

        Try this if you want to use Fragment with ViewPager2


        首先创建一个 ViewPagerFragmentAdapter 类,该类扩展了 FragmentStateAdapter >

        First create a ViewPagerFragmentAdapter class which extends FragmentStateAdapter



        import java.util.ArrayList;
        import androidx.annotation.NonNull;
        import androidx.fragment.app.Fragment;
        import androidx.fragment.app.FragmentManager;
        import androidx.viewpager2.adapter.FragmentStateAdapter;
        
        public class ViewPagerFragmentAdapter extends FragmentStateAdapter {
        
            private ArrayList<Fragment> arrayList = new ArrayList<>();
        
            public ViewPagerFragmentAdapter(@NonNull FragmentManager fragmentManager) {
                super(fragmentManager);
            }
        
            @NonNull
            @Override
            public Fragment getItem(int position) {
                return arrayList.get(position);
            }
        
            public void addFragment(Fragment fragment) {
                arrayList.add(fragment);
            }
        
            @Override
            public int getItemCount() {
                return arrayList.size();
            }
        }
        




        现在使用像这样在您的活动中

        Now use like this in your activity



        import androidx.annotation.Nullable;
        import androidx.appcompat.app.AppCompatActivity;
        import androidx.viewpager2.widget.ViewPager2;
        import neel.com.bottomappbar.R;
        
        public class MainActivity extends AppCompatActivity {
        
            ViewPager2 myViewPager2;
            ViewPagerFragmentAdapter myAdapter;
        
            @Override
            protected void onCreate(@Nullable Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
        
                myViewPager2 = findViewById(R.id.view_pager);
        
                myAdapter = new ViewPagerFragmentAdapter(getSupportFragmentManager());
        
                // add Fragments in your ViewPagerFragmentAdapter class
                myAdapter.addFragment(new FragmentOne());
                myAdapter.addFragment(new Fragmenttwo());
                myAdapter.addFragment(new FragmentThree());
        
                // set Orientation in your ViewPager2
                myViewPager2.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
        
                myViewPager2.setAdapter(myAdapter);
        
            }
        
        }
        

        了解更多信息选中此

        • ViewPager2
        • ViewPager2 under the Hood
        • Hands on With ViewPager2

        版本1.0.0-alpha02

        新功能


        • 禁用用户输入的能力( setUserInputEnabled isUserInputEnabled

        • Ability to disable user input (setUserInputEnabled, isUserInputEnabled)

        API更改


        • ViewPager2 类最终版本

        • ViewPager2 class final

        错误修复


        • FragmentStateAdapter 稳定性修复

        • FragmentStateAdapter stability fixes

        示例代码以禁止在viewpager2中滑动

        myViewPager2.setUserInputEnabled(false);// SAMPLE CODE to disable swiping in viewpager2
        
        
        myViewPager2.setUserInputEnabled(true);//SAMPLE CODE to enable swiping in viewpager2
        



        更新3



        UPDATE 3


        版本1.0.0-alpha03

        Version 1.0.0-alpha03

        新功能




        • 能力以编程方式滚动ViewPager2: fakeDragBy(offsetPx)

          • Ability to programmatically scroll ViewPager2: fakeDragBy(offsetPx).

          • API更改

            API changes




              FragmentStateAdapter 现在需要一个 Lifecycle 对象。添加了两个实用程序构造函数,以从主机 FragmentActivity 或主机Fragment

              • FragmentStateAdapter now requires a Lifecycle object. Two utility constructors added to obtain it from the host FragmentActivity or the host Fragment
              • 示例代码


                ViewPagerFragmentAdapter

                ViewPagerFragmentAdapter



                import java.util.ArrayList;
                import androidx.annotation.NonNull;
                import androidx.fragment.app.Fragment;
                import androidx.fragment.app.FragmentManager;
                import androidx.lifecycle.Lifecycle;
                import androidx.viewpager2.adapter.FragmentStateAdapter;
                
                public class ViewPagerFragmentAdapter extends FragmentStateAdapter {
                
                    private ArrayList<Fragment> arrayList = new ArrayList<>();
                
                
                    public ViewPagerFragmentAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
                        super(fragmentManager, lifecycle);
                    }
                
                    @NonNull
                    @Override
                    public Fragment getItem(int position) {
                        return arrayList.get(position);
                    }
                
                    public void addFragment(Fragment fragment) {
                        arrayList.add(fragment);
                    }
                
                    @Override
                    public int getItemCount() {
                        return arrayList.size();
                    }
                }
                




                MainActivity code

                MainActivity code



                import android.os.Bundle;
                import androidx.annotation.Nullable;
                import androidx.appcompat.app.AppCompatActivity;
                import androidx.viewpager2.widget.ViewPager2;
                import neel.com.bottomappbar.R;
                
                public class MainActivity extends AppCompatActivity {
                
                    ViewPager2 myViewPager2;
                    ViewPagerFragmentAdapter myAdapter;
                
                    @Override
                    protected void onCreate(@Nullable Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        setContentView(R.layout.activity_main);
                
                        myViewPager2=findViewById(R.id.view_pager);
                        myAdapter = new ViewPagerFragmentAdapter(getSupportFragmentManager(), getLifecycle());
                
                        // add Fragments in your ViewPagerFragmentAdapter class
                        myAdapter.addFragment(new FragmentOne());
                        myAdapter.addFragment(new Fragmenttwo());
                        myAdapter.addFragment(new FragmentThree());
                
                        myViewPager2.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
                
                        myViewPager2.setAdapter(myAdapter);
                    }
                }
                



                UPDATE 4



                UPDATE 4


                版本1.0.0-alpha05
                新功能

                Version 1.0.0-alpha05 New features




                • ItemDecorator 引入的行为与 RecyclerView 一致。
                • 引入
                • MarginPageTransformer 来提供在页面之间创建空间的功能(页面插入之外)。

                • 引入了 CompositePageTransformer 以提供组合多个 PageTransformers

                  • ItemDecorator introduced with a behaviour consistent with RecyclerView.
                  • MarginPageTransformer introduced to provide an ability to create space between pages (outside of page inset).
                  • CompositePageTransformer introduced to provide an ability to combine multiple PageTransformers

                  • API更改

                    API changes




                    • <$将c $ c> FragmentStateAdapter#getItem 方法重命名为 FragmentStateAdapter#createFragment -以前的方法名称被证明是过去漏洞的来源。 / li>
                    • OFFSCREEN_PAGE_LIMIT_DEFAULT 的值从0更改为-1。如果使用 OFFSCREEN_PAGE_LIMIT_DEFAULT常量,则无需更改客户端代码。

                      • FragmentStateAdapter#getItem method renamed to FragmentStateAdapter#createFragment - previous method name has proven to be a source of bugs in the past.
                      • OFFSCREEN_PAGE_LIMIT_DEFAULT value changed from 0 to -1. No need for a client code change if the OFFSCREEN_PAGE_LIMIT_DEFAULTconstant used.
                      • 示例代码


                        活动代码

                        Activity code



                        import androidx.annotation.NonNull;
                        import androidx.annotation.Nullable;
                        import androidx.appcompat.app.AppCompatActivity;
                        import androidx.fragment.app.Fragment;
                        import androidx.recyclerview.widget.RecyclerView;
                        import androidx.viewpager2.widget.MarginPageTransformer;
                        import androidx.viewpager2.widget.ViewPager2;
                        import neel.com.bottomappbar.R;
                        
                        public class MainActivity extends AppCompatActivity {
                        
                            ViewPager2 myViewPager2;
                            ViewPagerFragmentAdapter myAdapter;
                            private ArrayList<Fragment> arrayList = new ArrayList<>();
                        
                            @Override
                            protected void onCreate(@Nullable Bundle savedInstanceState) {
                                super.onCreate(savedInstanceState);
                                setContentView(R.layout.activity_main);
                        
                                myViewPager2 = findViewById(R.id.myViewPager2);
                        
                                // add Fragments in your ViewPagerFragmentAdapter class
                                arrayList.add(new FragmentOne());
                                arrayList.add(new Fragmenttwo());
                                arrayList.add(new FragmentThree());
                        
                                myAdapter = new ViewPagerFragmentAdapter(getSupportFragmentManager(), getLifecycle());
                                // set Orientation in your ViewPager2
                                myViewPager2.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
                        
                                myViewPager2.setAdapter(myAdapter);
                        
                                myViewPager2.setPageTransformer(new MarginPageTransformer(1500));
                        
                        
                            }
                        }
                        




                        ViewPagerFragmentAdapter

                        ViewPagerFragmentAdapter



                        import java.util.ArrayList;
                        import androidx.annotation.NonNull;
                        import androidx.fragment.app.Fragment;
                        import androidx.fragment.app.FragmentManager;
                        import androidx.lifecycle.Lifecycle;
                        import androidx.viewpager2.adapter.FragmentStateAdapter;
                        
                        public class ViewPagerFragmentAdapter extends FragmentStateAdapter {
                        
                            private ArrayList<Fragment> arrayList = new ArrayList<>();
                        
                        
                            public ViewPagerFragmentAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
                                super(fragmentManager, lifecycle);
                            }
                        
                            @NonNull
                            @Override
                            public Fragment createFragment(int position) {
                                switch (position) {
                                    case 0:
                                        return new FragmentOne();
                                    case 1:
                                        return new Fragmenttwo();
                                    case 2:
                                        return new FragmentThree();
                        
                                }
                                return null;
                            }
                        
                            @Override
                            public int getItemCount() {
                                return 3;
                            }
                        }
                        

                        这篇关于在Android中使用ViewPager2的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆