ViewPager嵌套ViewPager,的事件分发机制!
2016-11-29 09:20
316 查看
//外层ViewPager的xml,不用做处理。在里层的自定义viewpager,onTouchEvent中判断是否拦截,如果点到自定义viewpager上面,就不要拦截,如果没有点到自定义viewpager就请求拦截掉改事件。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="bawei.ontouchevent.MainActivity"> <android.support.v4.view.ViewPager android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/vp_out" ></android.support.v4.view.ViewPager> </LinearLayout> //fragment 的xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="wrap_content"> <view.InViewPager android:layout_width="match_parent" android:layout_height="200dp" android:id="@+id/vp_in" ></view.InViewPager> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="wrap_content"></ListView> </LinearLayout> //如果点击或者触摸到(down或者move)自定义viewpager,告诉父类不要拦截,在子类的onTouchEvent方法中消费掉该事件。如果没有点击到,告诉父类拦截掉(cancle或者up),在父类中消费掉该事件 package view; import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.MotionEvent; /** * 1.类的用途 * 2.@author:Sunyubo * 3.@ 2016/11/28. */ public class InViewPager extends ViewPager{ public InViewPager(Context context) { super(context); } public InViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent ev) { if(this.getChildCount()<=1){ return super.onTouchEvent(ev); } switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: //告诉父类不要拦截 getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_MOVE: getParent().requestDisallowInterceptTouchEvent(true); break; //告诉父类拦截 case MotionEvent.ACTION_UP: getParent().requestDisallowInterceptTouchEvent(false); break; case MotionEvent.ACTION_CANCEL: getParent().requestDisallowInterceptTouchEvent(false); break; } //执行父类原来的逻辑 super.onTouchEvent(ev); return true; } } //其他的都和原来的一样 fragment1中的代码 package fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import java.util.ArrayList; import java.util.List; import bawei.ontouchevent.R; /** * 1.类的用途 * 2.@author:Sunyubo * 3.@ 2016/11/28. */ public class Fragment1 extends android.support.v4.app.Fragment{ private View view; private ViewPager vp; private ListView lv; List<Integer> list=new ArrayList<>(); List<String> list1=new ArrayList<>(); @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // view = inflater.inflate(R.layout.f1,null); view=View.inflate(getActivity(),R.layout.f1,null); vp =(ViewPager)view.findViewById(R.id.vp_in); lv =(ListView)view.findViewById(R.id.lv); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initdata(); lv.setAdapter(new ArrayAdapter(getActivity(),android.R.layout.simple_list_item_1,list1)); vp.setAdapter(new PagerAdapter() { @Override public int getCount() { return list.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view==object; } @Override public Object instantiateItem(ViewGroup container, int position) { ImageView i=new ImageView(getActivity()); i.setImageResource(list.get(position)); container.addView(i); return i; } @Override public void destroyItem(ViewGroup container, int position, Object object) { // super.destroyItem(container, position, object); container.removeView((View) object); } }); } private void initdata() { list.clear(); list.add(R.drawable.a1); list.add(R.drawable.a2); list.add(R.drawable.a3); list.add(R.drawable.a4); for(int i=0;i<20;i++){ list1.add("这是第"+i+"条数据"); } } } //fragment2和fragment3代码一样 package fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /** * 1.类的用途 * 2.@author:Sunyubo * 3.@ 2016/11/28. */ public class Fragment2 extends android.support.v4.app.Fragment{ @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { TextView tv=new TextView(getActivity()); tv.setText("Fragment2"); return tv; } } //mainActivity package bawei.ontouchevent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import java.util.ArrayList; import java.util.List; import fragment.Fragment1; import fragment.Fragment2; import fragment.Fragment3; public class MainActivity extends AppCompatActivity { private ViewPager vp; List<Fragment> list=new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); vp =(ViewPager)findViewById(R.id.vp_out); initFragment(); vp.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public Fragment getItem(int position) { return list.get(position); } @Override public int getCount() { return list.size(); } }); } private void initFragment() { Fragment fragment1=new Fragment1(); Fragment fragment2=new Fragment2(); Fragment fragment3=new Fragment3(); list.add(fragment1); list.add(fragment2); list.add(fragment3); } }
相关文章推荐
- 从ViewPager嵌套RecyclerView再嵌套RecyclerView看安卓事件分发机制
- 在viewpager中嵌套fragment再嵌套viewpager的事件分发问题解决
- Android事件机制之ViewPager的分发与拦截
- Ultra-Pull-To-Refresh 和ViewPager冲突以及Android事件分发机制
- android开发游记:从viewpager禁用滚动 总结android事件分发机制
- ViewPager懒加载和事件分发机制图例
- 在viewpager中嵌套fragment再嵌套viewpager的事件分发问题解决
- 解决SorollView中和其他控件的事件分发机制-例如嵌套地图
- 学习过程中遇到很好的博客去学习-Handler详解(超棒)-View事件分发机制(解决ViewPager的滑动冲突)
- Android触摸事件传递机制及viewpager嵌套fragment冲突处理
- [Android开发]使用ViewPagerIndicator开源库处理其中事件分发机制
- 嵌套viewpager触摸的事件分发事件处理
- 解决双ViewPager嵌套的事件分发和去掉viewpager滑动问题
- Android ViewGroup事件分发机制
- Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制
- Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制
- Android View 事件分发机制详解
- Android事件分发机制详解(2)----分析ViewGruop的事件分发
- Android View事件分发机制
- ViewPager嵌套ViewPager不能响应滑动事件解决方法