美文网首页
Android TabLayout+ViewPager+Frag

Android TabLayout+ViewPager+Frag

作者: 背锅TV丶伴奏大师 | 来源:发表于2021-11-02 13:56 被阅读0次

    1.XML布局中

    <RelativeLayout 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.cobe.app.widget.BanViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@+id/tabLayout" />
    
        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tabLayout"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_alignParentBottom="true"
            android:background="@color/white"
            app:tabBackground="@color/transparent"
            app:tabGravity="fill"
            app:tabIndicatorHeight="0dp"
            app:tabMode="fixed"
            app:tabRippleColor="@null" />
    
    </RelativeLayout>
    

    2.MainTab

    public class MainTab {
        private Fragment fragment;
        private String name;
        private int res;
    
        public Fragment getFragment() {
            return fragment;
        }
    
        public void setFragment(Fragment fragment) {
            this.fragment = fragment;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getRes() {
            return res;
        }
    
        public void setRes(int res) {
            this.res = res;
        }
    
        public MainTab(Fragment fragment, String name, int res) {
            this.fragment = fragment;
            this.name = name;
            this.res = res;
        }
    }
    

    3.子布局:list_item_nav.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageView
            android:id="@+id/img"
            android:layout_centerHorizontal="true"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:scaleType="centerInside"
            android:src="@mipmap/icon_camera" />
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp"
            android:layout_below="@+id/img"
            android:layout_centerHorizontal="true"
            android:text="首页"
            android:textColor="@drawable/tab_text_color"
            android:textSize="12dp" />
    </RelativeLayout>
    

    4.选中与未选中时文字的颜色设置:drawable/tab_text_color

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:color="@color/blue" android:state_selected="true"/>
        <item android:color="@color/color_333" />
    </selector>
    

    5.图标选中与未选中时的设置(有几个tab就新建几个):drawable/main_tab.xml

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@mipmap/icon_tab1" android:state_selected="true"/>
        <item android:drawable="@mipmap/icon_tab1_un"/>
    </selector>
    

    6.fragment的适配器:MainFragmentAdapter

    public class MainFragmentAdapter extends FragmentPagerAdapter {
        private Context mContext;
        private List<MainTab> mainTabs;
        
        public MainFragmentAdapter(FragmentManager fm, Context context, List<MainTab> mainTabs) {
            super(fm);
            this.mContext = context;
            this.mainTabs=mainTabs;
        }
        public View getView(int pos){
            View view = LayoutInflater.from(mContext).inflate(R.layout.list_item_nav,null);
            TextView name = view.findViewById(R.id.name);
            ImageView img = view.findViewById(R.id.img);
            name.setText(mainTabs.get(pos).getName());
            img.setImageResource(mainTabs.get(pos).getRes());
            return view;
        }
    
        @Override
        public Fragment getItem(int position) {
            return mainTabs.get(position).getFragment();
          
        }
    
        @Override
        public int getCount() {
            return mainTabs.size();
          
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            return mainTabs.get(position).getName();
            
        }
    
        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }
    }
    

    7.不可滑动的viewpager:BanViewPager

    public class BanViewPager extends ViewPager {
        private boolean isCanScroll = true;
    
        public BanViewPager(Context context) {
            super(context);
        }
    
        public BanViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public void setNoScroll(boolean noScroll) {
            this.isCanScroll = noScroll;
        }
    
        @Override
        public void scrollTo(int x, int y) {
            super.scrollTo(x, y);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent arg0) {
            if (isCanScroll) {
                return false;
            } else {
                return super.onTouchEvent(arg0);
            }
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent arg0) {
            if (isCanScroll) {
                return false;
            } else {
                return super.onInterceptTouchEvent(arg0);
            }
        }
    
        @Override
        public void setCurrentItem(int item) {
            super.setCurrentItem(item, false);
        }
    }
    

    8.tab的名字:arrays.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="main_tab">
            <item>消息</item>    
            <item>动态</item>
            <item>我的</item>
        </string-array>   
    </resources>
    

    9.最后在MainActivity的使用:

    private MainFragmentAdapter mAdapter;
    private BanViewPager mVp;
     private TabLayout mTabLayout;
    private void initTabLayout() {
    String[] mName = getResources().getStringArray(R.array.main_tab);
    int[] mRes =new int[] {R.drawable.main_tab1,R.drawable.main_tab2, R.drawable.main_tab3};
    List<MainTab> mainTabs=new ArrayList<>();
    MainTab mainTab1=new MainTab(fragment1,mName[0],mRes[0]);
    MainTab mainTab2=new MainTab(fragment1,mName[1],mRes[1]);
    MainTab mainTab3=new MainTab(fragment1,mName[2],mRes[2]);
    mainTabs.add(mainTab1);
    mainTabs.add(mainTab2);
    mainTabs.add(mainTab3);
    mAdapter=new MainFragmentAdapter(getSupportFragmentManager(),mContext,mainTabs);
    mVp.setAdapter(mAdapter);
    mTabLayout.setupWithViewPager(mVp);
    updateTabLayoutView();
    mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    //mVp.setCurrentItem(tab.getPosition());
                  //或者
                  updateTabLayoutView();
                }
    
                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
    
                }
    
                @Override
                public void onTabReselected(TabLayout.Tab tab) {
    
                }
            });
            mVp.setCurrentItem(lastIndex);
    }
    private void updateTabLayoutView(){
            for (int i = 0; i < mTabLayout.getTabCount(); i++) {
                TabLayout.Tab tab = mTabLayout.getTabAt(i);
                if (tab != null) {
                    View v;
                    if(tab.getCustomView()==null){
                        v= mAdapter.getView(i);
                    }else{
                        v =tab.getCustomView();
                    }
                    if (i == lastIndex) {//默认第i个选中
                        v.setSelected(true);
                    }else{
                        v.setSelected(false);
                    }
                    tab.setCustomView(v);
                }
            }
        }
    

    完结撒花!!!!!

    相关文章

      网友评论

          本文标题:Android TabLayout+ViewPager+Frag

          本文链接:https://www.haomeiwen.com/subject/xqwxzltx.html