Android开发之TabLayout真正实现底部导航栏(可实现点击文字颜色图片切换)
2018-01-08 00:42
796 查看
前言:关于这个TabLayout实现底部导航,在我的上篇《Android开发之TabLayout实现底部导航栏》博客中有提到,但是后面在仔细的接触项目中,发现了里面有很多没有解决的事情,比如不能实现点击文字颜色和图片的切换,不能做到禁止左右滑动,所以趁着今天有时间的情况下,把这几个功能好好的完善一下!
----效果图----
----分析----
分析:通过上篇博客中我们可以知道,图片和文字的填充是在一个人for循环中完成的,在for循环中动态的添加,所以我们要通过更改一下这个for循环,具体做法是把文字的填充写在pagerAdapter中,通过mTabLayout.getTabAt(i).setCustomView(mPagerAdapter.getTabView(i));然后再搭配 mTabLayout.setOnTabSelectedListener里面 onTabSelected(选中状态)onTabUnselected(未选中状态)更改图片显示!
关于禁止左右滑动,我们只需要重写Viewpager中的onInterceptTouchEvent返回false目的是为 不拦截事件,让嵌套的子viewpager有机会响应触摸事件;重写onTouchEvent,返回true,目的是什么都不做;重写setCurrentItem为false,目的是切换的时候没有过渡动画。
---完整代码实现--
MainActivity.java:
----完---
----效果图----
----分析----
分析:通过上篇博客中我们可以知道,图片和文字的填充是在一个人for循环中完成的,在for循环中动态的添加,所以我们要通过更改一下这个for循环,具体做法是把文字的填充写在pagerAdapter中,通过mTabLayout.getTabAt(i).setCustomView(mPagerAdapter.getTabView(i));然后再搭配 mTabLayout.setOnTabSelectedListener里面 onTabSelected(选中状态)onTabUnselected(未选中状态)更改图片显示!
关于禁止左右滑动,我们只需要重写Viewpager中的onInterceptTouchEvent返回false目的是为 不拦截事件,让嵌套的子viewpager有机会响应触摸事件;重写onTouchEvent,返回true,目的是什么都不做;重写setCurrentItem为false,目的是切换的时候没有过渡动画。
---完整代码实现--
MainActivity.java:
package com.jiuzu.tablelayoutdemo; import android.os.Bundle; import android.support.annotation.Nullable; 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.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.TextView; /** * Created by Fly on 2017/11/29. */ public class MainActivity extends AppCompatActivity { String title[] = {"AA", "BB", "CC"}; int ints[] = {R.mipmap.category_press, R.mipmap.me, R.mipmap.shopping_cart}; ViewPager mViewPager; PagerAdapter mPagerAdapter; private TabLayout mTabLayout; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mViewPager = findViewById(R.id.view_pager); mTabLayout = findViewById(R.id.toolbar_tab); mPagerAdapter = new PagerAdapter(getSupportFragmentManager()); mViewPager.setAdapter(mPagerAdapter); mTabLayout.setupWithViewPager(mViewPager); for (int i = 0; i < mTabLayout.getTabCount(); i++) { mTabLayout.getTabAt(i).setCustomView(mPagerAdapter.getTabView(i)); } mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { switch (tab.getPosition()) { case 0: tab.getCustomView().findViewById(R.id.iv).setBackgroundResource(R.mipmap.category_press); break; case 1: tab.getCustomView().findViewById(R.id.iv).setBackgroundResource(R.mipmap.me_press); break; case 2: tab.getCustomView().findViewById(R.id.iv).setBackgroundResource(R.mipmap.shopping_car_press); break; } TextView textView = tab.getCustomView().findViewById(R.id.tv); textView.setTextColor(getResources().getColor(R.color.colorAccent)); } @Override public void onTabUnselected(TabLayout.Tab tab) { switch (tab.getPosition()) { case 0: tab.getCustomView().findViewById(R.id.iv).setBackgroundResource(R.mipmap.category); break; case 1: tab.getCustomView().findViewById(R.id.iv).setBackgroundResource(R.mipmap.me); break; case 2: tab.getCustomView().findViewById(R.id.iv).setBackgroundResource(R.mipmap.shopping_cart); break; } TextView textView = tab.getCustomView().findViewById(R.id.tv); textView.setTextColor(getResources().getColor(R.color.lll));// <color name="lll">#000</color> } @Override public void onTabReselected(TabLayout.Tab tab) { } }); } public class PagerAdapter extends FragmentPagerAdapter { public PagerAdapter(FragmentManager fm) { super(fm); } @Override public CharSequence getPageTitle(int position) { return title[position]; } @Override public Fragment getItem(int position) { Fragment f = new MyFragment(); Bundle bundle = new Bundle(); bundle.putString("title", title[position]); f.setArguments(bundle); return f; } @Override public int getCount() { return title.length; } public View getTabView(int position) { View v = LayoutInflater.from(MainActivity.this).inflate(R.layout.item, null); ImageView iv = v.findViewById(R.id.iv); TextView tv = v.findViewById(R.id.tv); iv.setBackgroundResource(ints[position]); tv.setText(title[position]); if (position == 0) { tv.setTextColor(v.getResources().getColor(R.color.colorAccent)); } return v; } } }activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.jiuzu.tablelayoutdemo.NoScrollViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" /> <android.support.design.widget.TabLayout android:id="@+id/toolbar_tab" android:layout_width="match_parent" android:layout_height="60dp" android:background="#CCC" app:tabGravity="fill" app:tabIndicatorHeight="0dp" app:tabMode="fixed" app:tabSelectedTextColor="?attr/colorPrimaryDark" app:tabTextColor="?attr/colorPrimary"> </android.support.design.widget.TabLayout> </LinearLayout>MyFragment.java:
package com.jiuzu.tablelayoutdemo; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /** * Created by Fly on 2017/11/25. */ public class MyFragment extends Fragment { @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.f, null); TextView textView = view.findViewById(R.id.tv); Bundle bundle = getArguments(); String str = bundle.getString("title"); textView.setText(str); return view; } }f.xml:
<?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"> <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="你好" android:textSize="25sp" /> </LinearLayout>item.xml:
<?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="wrap_content" android:gravity="center" android:orientation="vertical"> <ImageView android:id="@+id/iv" android:layout_width="40dp" android:layout_height="40dp" /> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按钮" android:textColor="#000" /> </LinearLayout>NoScrollViewPager.java:
package com.jiuzu.tablelayoutdemo; import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.MotionEvent; /** * Created by Fly on 2017/11/25. */ public class NoScrollViewPager extends ViewPager { public NoScrollViewPager(@NonNull Context context) { super(context); } public NoScrollViewPager(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { return false;//不拦截事件,让嵌套的子viewpager有机会响应触摸事件 } @Override public boolean onTouchEvent(MotionEvent arg0) { // 重写ViewPager滑动事件,改什么都不做 return true; } @Override public void setCurrentItem(int item) { super.setCurrentItem(item, false);//表示切换的时候,不需要切换时间。 } }
----完---
相关文章推荐
- Android开发之TabLayout实现底部导航栏
- Android开发:顶部&底部Tab导航栏实现(TabLayout+ViewPager+Fragment)
- Android开发实现按钮点击切换背景并修改文字颜色的方法
- Android TabLayout、ViewPager实现顶部和底部Tab导航 点击滑动切换Tab页面
- Android开发——实现点击图片切换效果
- mui底部导航栏点击切换图片和颜色
- Android 用 TabLayout + ViewPager + Fragment 实现顶部、底部导航栏
- Android开发技巧——实现底部图标文字的导航栏(已更新)
- Android底部导航栏实现(四)之TabLayout+ViewPager
- Android开发技巧——实现底部图标文字的导航栏(已更新)
- Android开发技巧——实现底部图标文字的导航栏(已更新)
- Android开发笔记之TabLayout实现导航栏的效果
- Android开发技巧——实现底部图标文字的导航栏(已更新)
- Android开发技巧——实现底部图标文字的导航栏(已更新)
- Android之新闻客服端顶部导航栏Tab点击和左右滑动实现切换界面
- Android开发技巧——实现底部图标文字的导航栏(已更新)
- Android开发技巧——实现底部图标文字的导航栏(已更新)
- Android之新闻客服端顶部导航栏Tab点击和左右滑动实现切换界面
- TabLayout+ViewPager+Fragment实现带图标和文字的底部导航栏
- Android中Tab的应用,底部,随选择切换图标和文字颜色