TabLayout+ViewPager自定义view实现图文混排微信选项卡框架和联动切换同步改变数据功能
2017-07-20 14:34
585 查看
效果图:
1.MainAcvitity.xml
自定义TabLayout的图文混排的view布局
3.上述的textcolor使用自定义文字选择指示器切换不同状态下的文字颜色
如果要改大小样式,那就引用自定义的style
给ViewPager添加fragment的数据源
4.自定义FragmentPagerAdapter设置fragment数据源到ViewPager上
5、MainAcvitity。Java的实现:
1.MainAcvitity.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.ytf.myapplication.MainActivity"> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:scrollbars="none"> </android.support.v4.view.ViewPager> <ImageView android:layout_width="match_parent" android:layout_height="0.5dp" android:src="@android:color/darker_gray" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="55dp" android:layout_gravity="bottom"> <android.support.design.widget.TabLayout android:id="@+id/tabLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" app:tabGravity="fill" app:tabIndicatorHeight="0dp" app:tabMode="fixed" app:tabSelectedTextColor="#FF4081" app:tabTextColor="#000"></android.support.design.widget.TabLayout> </RelativeLayout> 10e31 ; </LinearLayout>
自定义TabLayout的图文混排的view布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:padding="4dp" android:id="@+id/tab_iv" android:layout_width="35dp" android:layout_height="35dp" android:layout_gravity="center" android:scaleType="centerCrop" /> <TextView android:id="@+id/tab_tv" android:layout_width="match_parent" android:layout_height="20dp" android:gravity="center" android:textSize="12sp" android:textColor="@drawable/text_selector" android:layout_gravity="center"/> </LinearLayout>
3.上述的textcolor使用自定义文字选择指示器切换不同状态下的文字颜色
如果要改大小样式,那就引用自定义的style
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="#ff5252" android:state_selected="true" ></item> <item android:color="#abd0bc" android:state_selected="false"></item> </selector>
给ViewPager添加fragment的数据源
package com.ytf.myapplication.fragment; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.ytf.myapplication.R; /** * A simple {@link Fragment} subclass. */ public class Fragment1 extends Fragment { public Fragment1() { // Required empty public constructor } //使用静态工厂方法实例化对象 public static Fragment1 newInstance() { Bundle args = new Bundle(); Fragment1 fragment = new Fragment1(); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_fragment1, container, false); } }
4.自定义FragmentPagerAdapter设置fragment数据源到ViewPager上
package com.ytf.myapplication.fragment; import android.content.Context; import android.os.Bundle; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.ytf.myapplication.R; import java.util.ArrayList; import java.util.List; /** * Created by YTF on 2017/7/19. */ public class MyPageAdapter extends FragmentPagerAdapter { private List<Fragment> list=new ArrayList<>(); // private String[] mTitles = null;//只有文字的选项卡在此处合fragment一起设置数据源 // private int[] mImg = new int[]{R.drawable.login_qq, R.drawable.login_wechat, R.drawable.login_qq, R.drawable.login_wechat}; private Context context; private LayoutInflater inflater; private TabLayout mTableLayout; private ImageView tab_iv; private TextView tab_tv; public MyPageAdapter(FragmentManager fm, List<Fragment> list,Context context) { super(fm); this.list = list; this.context = context; inflater=LayoutInflater.from(context); } // public void addFragment(Fragment fragment){ // list.add(fragment); // // } public MyPageAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return list.get(position); } @Override public int getCount() { return list.size(); } /** * 此方法只在只有文字的选项卡中重写用于配合setupWithViewPager实现联动 * 自定义view不需要重写,写了也会清除 */ // @Override // public CharSequence getPageTitle(int position) { // return super.getPageTitle(position); //// return list.get(position); // } }
5、MainAcvitity。Java的实现:
package com.ytf.myapplication; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.ytf.myapplication.fragment.Fragment1; import com.ytf.myapplication.fragment.Fragment2; import com.ytf.myapplication.fragment.Fragment3; import com.ytf.myapplication.fragment.Fragment4; import com.ytf.myapplication.fragment.MyPageAdapter; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private TabLayout mTableLayout; private ViewPager mViewPager; private String[] mTitles = new String[]{"微信", "通讯录", "发现", "我"}; private int[] mImg = new int[]{R.drawable.a8w, R.drawable.zg, R.drawable.yo, R.drawable.y_}; private int[] mImg_selector = new int[]{R.drawable.u4, R.drawable.u5, R.drawable.a6d, R.drawable.a6m}; private ImageView tab_iv; private TextView tab_tv; private List<Fragment> list = new ArrayList<>(); // private Fragment1 fragment1; // private Fragment2 fragment2; // private Fragment3 fragment3; // private Fragment4 fragment4; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initview(); } /** * setupWithViewPager只能适应文字的选项卡样式,如果在Tab中有自定义的view * 意味着放弃自定义view,TabLayout内部在添加Tab时候,会自动从ViewPager适配器PagerAdapter的getPageTitle() * 获得一个字符串然后作为一个TextView添加到TabLayout中(自定义view会被完全清除) */ private void initview() { mTableLayout = (TabLayout) findViewById(R.id.tabLayout); mViewPager = (ViewPager) findViewById(R.id.viewPager); showFragment(); LayoutInflater inflater = this.getLayoutInflater(); setTabs(mTableLayout, inflater, mTitles, mImg); // mTableLayout.setupWithViewPager(mViewPager); // 此处只能实现文字选项卡,自定义图文混排tab设置联动会清除setTab中的数据 //果要实现自定义的view,那么就要放弃setupWithViewPager(),用如下方式实现 mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTableLayout)); mTableLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager)); } private void setTabs(final TabLayout mTableLayout, LayoutInflater layoutInflater, String[] mTitles, final int[] mImg) { for (int i = 0; i < mTitles.length; i++) { TabLayout.Tab tab = mTableLayout.newTab(); View view = layoutInflater.inflate(R.layout.tab_custom_layout, null); tab.setCustomView(view); tab_iv = (ImageView) view.findViewById(R.id.tab_iv); tab_tv = (TextView) view.findViewById(R.id.tab_tv); tab_tv.setText(mTitles[i].toString()); if (i == 0) {//默认第一个tab为选中状态 tab_iv.setImageResource(mImg_selector[i]); } else { tab_iv.setImageResource(mImg[i]); } mTableLayout.addTab(tab); } // 点击不同的tab选项卡或者滑动ViewPager时候更换选项卡图片的操作 // 如果直接设置自定义view中的ImageView就会默认左右图片的改变都集中在最后一个tab mTableLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { switch (tab.getPosition()) { case 0: ImageView img0 = (ImageView) mTableLayout.getTabAt(0).getCustomView().findViewById(R.id.tab_iv); img0.setImageResource(mImg_selector[0]); break; case 1: ImageView img1 = (ImageView) mTableLayout.getTabAt(1).getCustomView().findViewById(R.id.tab_iv); img1.setImageResource(mImg_selector[1]); // tab_iv.setImageResource(mImg_selector[1]); break; case 2: ImageView img2 = (ImageView) mTableLayout.getTabAt(2).getCustomView().findViewById(R.id.tab_iv); img2.setImageResource(mImg_selector[2]); break; case 3: ImageView img3 = (ImageView) mTableLayout.getTabAt(3).getCustomView().findViewById(R.id.tab_iv); img3.setImageResource(mImg_selector[1]); break; } } @Override public void onTabUnselected(TabLayout.Tab tab) {//未选中状态的图片恢复各自默认 switch (tab.getPosition()) { case 0: ImageView img0 = (ImageView) mTableLayout.getTabAt(0).getCustomView().findViewById(R.id.tab_iv); img0.setImageResource(mImg[0]); break; case 1: ImageView img1 = (ImageView) mTableLayout.getTabAt(1).getCustomView().findViewById(R.id.tab_iv); img1.setImageResource(mImg[1]); break; case 2: ImageView img2 = (ImageView) mTableLayout.getTabAt(2).getCustomView().findViewById(R.id.tab_iv); img2.setImageResource(mImg[2]); break; case 3: ImageView img3 = (ImageView) mTableLayout.getTabAt(3).getCustomView().findViewById(R.id.tab_iv); img3.setImageResource(mImg[3]); break; } } @Override public void onTabReselected(TabLayout.Tab tab) { } }); mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { Fragment fragment=list.get(position); fragment.onResume();//当fragment选中时手动调用onresume方法更新Fragment数据 } @Override public void onPageScrollStateChanged(int state) { } }); } /** * viewpager展示fragment */ private void showFragment() { list.add(Fragment1.newInstance()); list.add(Fragment2.newInstance()); list.add(Fragment3.newInstance()); list.add(Fragment4.newInstance()); MyPageAdapter myPageAdapter = new MyPageAdapter(getSupportFragmentManager(), list, this); mViewPager.setAdapter(myPageAdapter); } }
相关文章推荐
- Android实现连续并排的若干个TextView单击改变背景颜色达到选项卡Tab栏切换效果
- ViewPager的使用(实现微信左右切换页卡功能)
- viewPager+fragment实现分页切换,跳转至别的页面改变数据,fragment没有改变
- viewPager+fragment实现分页切换,跳转至别的页面改变数据,fragment没有改变
- 实现GridView控件的多项功能:改变背景色、和FormView控件同步、隐藏指定列、添加删除确认、跳转到指定页。。[原创]
- 实现类似QQ聊天列表的segment点击切换tableView的数据功能
- viewPager+fragment实现分页切换,跳转至别的页面改变数据,fragment没有改变
- Android实现连续并排的若干个TextView单击改变背景颜色达到选项卡Tab栏切换效果
- viewpager+fragment的懒加载实现微信点击和滑动切换功能(切换效果)
- TabHost+ViewPager实现 点击选项卡和滑动界面都可以切换页面
- SSH开发框架中,实现系统启动加载类,读取数据库常用数据进入内存,利用Spring托管,并完成reload功能
- UITableView实现下拉刷新添加数据功能
- 一步一步重写 CodeIgniter 框架 (7) —— Controller执行时将 Model获得的数据传入View中,实现MVC
- NavigationController 的view 之间切换的实现功能
- Android实现类似Excel显示数据功能(支持拖动改变列宽)v 1.0
- 【转】Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- 用Maven整合SpringMVC+Spring+Hibernate 框架,实现简单的插入数据库数据功能(二)
- Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- 利用C#实现数据同步功能
- Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信