TextView 取代 Tablayout实现滑动布局
- 准备 HomeViewPager + HomeViewPagerAdapter + Fragment
HomeViewPager.java
package xxx.com.quicktv.widget;
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;
/**
* ================================================
* 作 者:zhoujianan
* 版 本:v1.0
* 创建日期:2019/9/25
* 描 述:
* 修订历史:
* ================================================
*/
public class HomeViewPager extends ViewPager {
private boolean mScrollable;
public HomeViewPager(@NonNull Context context) {
super(context);
}
public HomeViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public void setScrollable(boolean scrollable) {
mScrollable = scrollable;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (mScrollable) {
return super.onInterceptTouchEvent(ev);
} else {
return false;
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (mScrollable) {
return super.onTouchEvent(ev);
} else {
return false;
}
}
}
HomeViewPagerAdapter.java
package xxx.com.quicktv.adapter;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import java.util.List;
/**
* ================================================
* 作 者:zhoujianan
* 版 本:v1.0
* 创建日期:2019/9/25
* 描 述:
* 修订历史:
* ================================================
*/
public class HomeViewPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> mFragments;
public HomeViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
mFragments = fragments;
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
}
- Fragment若干
VodFragment.java
package xxx.com.quicktv.module.vod;
import android.os.Bundle;
import xxx.com.quicktv.R;
import xxx.com.quicktv.module.base.BaseFragment;
/**
* ================================================
* 作 者:zhoujianan
* 版 本:v1.0
* 创建日期:2020/7/10
* 描 述:
* 修订历史:
* ================================================
*/
public class VodFragment extends BaseFragment{
@Override
protected int attachLayoutRes() {
return R.layout.fragment_vod;
}
@Override
protected void initInjector() {
}
@Override
protected void initViews(Bundle savedInstanceState) {
}
@Override
protected void updateViews(boolean isRefresh) {
}
}
- 开始制作:
package xxx.com.quicktv.module.home;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.View;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
import xxx.com.quicktv.R;
import xxx.com.quicktv.adapter.HomeViewPagerAdapter;
import xxx.com.quicktv.module.base.BaseActivity;
import xxx.com.quicktv.module.live.LiveFragment;
import xxx.com.quicktv.module.profile.ProfileFragment;
import xxx.com.quicktv.module.vod.VodFragment;
import xxx.com.quicktv.widget.HomeViewPager;
public class HomeActivity extends BaseActivity {
@BindView(R.id.home_vp)
HomeViewPager mHomeViewPager;
@BindView(R.id.home_vod_tv)
TextView mHomeVodTv;
@BindView(R.id.home_live_tv)
TextView mHomeLiveTv;
@BindView(R.id.home_profile_tv)
TextView mProfileTv;
private View mCurrentSelectNavView;
private VodFragment mVodFragment = new VodFragment();
private LiveFragment mLiveFragment = new LiveFragment();
private ProfileFragment mProfileFragment = new ProfileFragment();
private ArrayList<Fragment> mFragments = new ArrayList<>();
private HomeViewPagerAdapter mPagerAdapter;
private List<View> mNavViews;
@Override
protected int attachLayoutRes() {
return R.layout.activity_home;
}
@Override
protected void initInjector() {
}
@Override
protected void initViews(Bundle savedInstanceState) {
mFragments.add(mVodFragment);
mFragments.add(mLiveFragment);
mFragments.add(mProfileFragment);
mPagerAdapter = new HomeViewPagerAdapter(getSupportFragmentManager(), mFragments);
mHomeViewPager.setAdapter(mPagerAdapter);
mNavViews = new ArrayList<>();
mNavViews.add(mHomeVodTv);
mNavViews.add(mHomeLiveTv);
mNavViews.add(mProfileTv);
}
@Override
protected void updateViews(boolean isRefresh) {
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@OnClick({R.id.home_vod_tv, R.id.home_live_tv, R.id.home_profile_tv})
public void onViewClicked(View view) {
refreshSelectNavView(view);
mHomeViewPager.setCurrentItem(mNavViews.indexOf(view), false);
}
public void refreshSelectNavView(View view) {
if (mCurrentSelectNavView == view) {
return;
}
if (mCurrentSelectNavView != null) {
mCurrentSelectNavView.setSelected(false);
}
view.setSelected(true);
mCurrentSelectNavView = view;
}
}
- 整体布局: activity_home.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
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"
android:background="#FF1C1C1E"
tools:context="yoostar.com.quicktv.module.home.HomeActivity">
<xxx.com.quicktv.widget.HomeViewPager
android:id="@+id/home_vp"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/home_vod_tv"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</xxx.com.quicktv.widget.HomeViewPager>
<TextView
android:paddingTop="@dimen/_8px_in720p"
android:id="@+id/home_vod_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableTop="@drawable/home_vod_selector"
android:gravity="center_horizontal"
android:text="@string/home_vod"
android:textColor="@drawable/home_tab_tv_selector"
android:textSize="@dimen/_20px_in720p"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/home_live_tv"/>
<TextView
android:paddingTop="@dimen/_8px_in720p"
android:id="@+id/home_live_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableTop="@drawable/home_live_selector"
android:gravity="center_horizontal"
android:text="@string/home_live"
android:textColor="@drawable/home_tab_tv_selector"
android:textSize="@dimen/_20px_in720p"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/home_vod_tv"
app:layout_constraintRight_toLeftOf="@id/home_profile_tv"/>
<TextView
android:paddingTop="@dimen/_8px_in720p"
android:id="@+id/home_profile_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableTop="@drawable/home_user_selector"
android:gravity="center_horizontal"
android:text="@string/home_profile"
android:textColor="@drawable/home_tab_tv_selector"
android:textSize="@dimen/_20px_in720p"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/home_live_tv"
app:layout_constraintRight_toRightOf="parent"/>
</android.support.constraint.ConstraintLayout>
home_tab_tv_selector.xml
注意 TextView设置字体颜色的时候,item android :color
,这里使用的是color而不是常见的drawable
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#FFE60615" android:state_selected="true"/>
<item android:color="#FFE60615" android:state_pressed="true"/>
<item android:color="@color/color_white"/>
</selector>
- 比较:就Tablayout而言,这种直接使用TextView,可以很方便的设置tab下的cusor样式,之前很难去修改tab的光标样式,其他都没有什么不同的地方,如果想了解TabLayout + ViewPager + Fragment ,请到https://blog.csdn.net/weixin_37716758/article/details/96846779,进一步进行了解。