跟viewpagerIndicator一样的效果,但是不用引用library包
本文转载自:
我擦,谁的这是???只能给一个下载地址了:https://codeload.github.com/ldb-github/Layout_Tab/zip/master
对不住,大神!
使用环境:
使用好处就是不用再依赖一个大大的viewpagerIndicator的包了
使用方法:
1 写下adapter
public class FragmentAdapter extends FragmentPagerAdapter { private ArrayList<Fragment> list; private ArrayList<String> titleList; public FragmentAdapter(FragmentManager fm, ArrayList<Fragment> list) { super(fm); this.list = list; } public FragmentAdapter(FragmentManager fm, ArrayList<Fragment> list, ArrayList<String> titleList) { super(fm); this.list = list; this.titleList = titleList; } @Override public Fragment getItem(int position) { return list.get(position); } @Override public int getCount() { return list.size(); } @Override public CharSequence getPageTitle(int position) { return titleList.get(position); } }
没有转换的烦恼,再也不用为了Fragment和view的问题来回折腾了。
2 创建MainActivity的布局:
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:orientation="horizontal" > <TextView android:id="@+id/tab1_tv" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="写入地址" android:textColor="#707070"/> <TextView android:id="@+id/tab2_tv" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="语音召唤" android:textColor="#707070"/> <TextView android:id="@+id/tab3_tv" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="多单召唤" android:textColor="#707070"/> </LinearLayout> <!--下划线颜色--> <View android:id="@+id/cursor" android:layout_width="80dp" android:layout_height="2dp" android:background="#EA5656" /> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> </layout>
MainActivity的代码:
package itcast.zz.nolibraryviewpagerindicator; import android.databinding.DataBindingUtil; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.util.DisplayMetrics; import android.view.View; import android.widget.LinearLayout; import java.util.ArrayList; import java.util.List; import itcast.zz.nolibraryviewpagerindicator.databinding.ActivityMainBinding; import itcast.zz.nolibraryviewpagerindicator.fragment.FragmentOne; import itcast.zz.nolibraryviewpagerindicator.fragment.FragmentThree; import itcast.zz.nolibraryviewpagerindicator.fragment.FragmentTwo; public class MainActivity extends FragmentActivity implements View.OnClickListener, ViewPager.OnPageChangeListener { private ActivityMainBinding mainBinding; private View cursorImg; // 指示器 private int currentIndex = 0; // 记录当前选中的tab的index private int offset = 0; // 指示器的偏移量 private int leftMargin = 0; // 左margin private int screenWidth = 0; // 屏幕宽度 private int tabCount; // Tab的数量 private int widthOfOneTab;// 一个Tab的宽度 screenWidth / tabCount private LinearLayout.LayoutParams lp; private List<Fragment> mFragments = new ArrayList<>(); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main); addViewPager(); } /** * 初始化操作 */ private void addViewPager() { DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); screenWidth = dm.widthPixels; cursorImg = (View) findViewById(R.id.cursor); lp = (LinearLayout.LayoutParams) cursorImg.getLayoutParams(); leftMargin = lp.leftMargin; mFragments.add(new FragmentOne()); mFragments.add(new FragmentTwo()); mFragments.add(new FragmentThree()); mainBinding.viewpager.setAdapter(new FragmentAdapter(getSupportFragmentManager(), (ArrayList<Fragment>) mFragments)); mainBinding.viewpager.setCurrentItem(0); mainBinding.viewpager.setOnPageChangeListener(this); tabCount = 3; widthOfOneTab = screenWidth / tabCount; // tab点击监听 mainBinding.tab1Tv.setOnClickListener(this); mainBinding.tab2Tv.setOnClickListener(this); mainBinding.tab3Tv.setOnClickListener(this); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { offset = (widthOfOneTab - cursorImg.getLayoutParams().width) / 2; if(position < tabCount - 1){ lp.leftMargin = (int) (positionOffsetPixels / tabCount) + widthOfOneTab * position + offset; } cursorImg.setLayoutParams(lp); currentIndex = position; } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } @Override public void onClick(View v) { switch (v.getId()){ case R.id.tab1_tv: mainBinding.viewpager.setCurrentItem(0); break; case R.id.tab2_tv: mainBinding.viewpager.setCurrentItem(1); break; case R.id.tab3_tv: mainBinding.viewpager.setCurrentItem(2); break; } } }
其中的fragment需要你自己去创建了,这个不说。
因为这个涉及到databinding的一点东西,但是在创建fragment的时候尽量不要使用databinding,因为你的fragment刚开始创建的时候太简单,databinding可能不会辨认这个东西,会造成不必要的麻烦。我就是创建了三个超级简单的fragment用的databinding,结果没有办法转换成view而且我还不知道。导致浪费了两个小时的时间。
省去了14M的library,开心的不得了!
代码地址:https://git.oschina.net/longlyblack/NoLibraryViewPagerIndicator.git