ViewPager中間嵌套ViewPager時(shí)示损,默認(rèn)事件會(huì)被內(nèi)部ViewPager攔截崭倘,當(dāng)滑動(dòng)到最左邊或者最右邊時(shí)聊替,會(huì)被外部ViewPager接收祥楣,如下圖所示:
默認(rèn)截圖
現(xiàn)項(xiàng)目有一需求开财,要求內(nèi)部ViewPager使用手動(dòng)切換,左右滑動(dòng)事件由外部ViewPager接收误褪,待實(shí)現(xiàn)效果如下圖所示:
內(nèi)部ViewPager禁止滑動(dòng)的截圖
解決方案
自定義內(nèi)部ViewPager责鳍,攔截內(nèi)部滑動(dòng)事件,重寫canScrollHorizontally
即可兽间,直接返回false历葛。
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 canScrollHorizontally(int direction) {
return false;
}
}
引用代碼,布局全部使用java實(shí)現(xiàn)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ViewPager contentView=new ViewPager(this);
setContentView(contentView);
final List<View> views = new ArrayList<>();
TextView view = new TextView(this);
ViewGroup.LayoutParams params=new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
view.setLayoutParams(params);
//數(shù)據(jù)填充
view.setText("我是第一個(gè)TextView");
view.setGravity(Gravity.CENTER);
views.add(view);
final ViewPager viewPager=new NoScrollViewPager(this);
viewPager.setAdapter(new PagerAdapter() {
@Override
public int getCount() {
return 2;
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view == o;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, final int position) {
TextView view = new TextView(MainActivity.this);
ViewGroup.LayoutParams params=new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
view.setLayoutParams(params);
//數(shù)據(jù)填充
view.setText("我是第二個(gè)ViewPager——position:"+position);
view.setGravity(Gravity.CENTER);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewPager.setCurrentItem(position==0?1:0);
}
});
container.addView(view);
return view;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
});
views.add(viewPager);
PagerAdapter adapter = new PagerAdapter() {
@Override
public int getCount() {
return views.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view == o;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
View view = views.get(position);
container.addView(view);
return view;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
};
contentView.setAdapter(adapter);
}
}