android.support.v4.view.ViewPager cannot be cast to com.custom.NoScrollViewPager 솔루션

9607 단어 Android
최근 안드로이드 앱을 쓰는 과정에서 슬라이딩이 금지된 Viewpager를 사용했기 때문에 선배 소가 제공한 솔루션을 사용했습니다.
웹 주소는 다음과 같습니다.https://blog.csdn.net/yilei0033/article/details/79444099
간단하게 말하면, 계승 ViewPager의 클래스를 사용자 정의합니다. NoScroll ViewPager, onInterceptTouch Event (Motion Event 이벤트) 를 다시 쓰고 setNoScroll (boolean noScroll) 방법을 추가했습니다.런타임 시 다음과 같은 예외가 발생했습니다.
01-20 11:12:12.890: E/AndroidRuntime(32097): Caused by: java.lang.ClassCastException: android.support.v4.view.ViewPager cannot be cast to com.example.library.NoScrollViewPager
이 이상은 제가 앱을 하나 썼을 때 만났던 기억이 납니다. 이번에는 또 한동안 괴로웠습니다. 이에 글을 써서 자신을 일깨워 주었습니다.
먼저 내 프로젝트의 코드를 첨부합니다.
우선, 사용자 정의 NoScroll ViewPager로 android를 계승했습니다.support.v4.view.ViewPager .
NoScrollViewPager.java
public class NoScrollViewPager extends android.support.v4.view.ViewPager {
	private boolean isCanScroll = false;

	public NoScrollViewPager(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}

	public NoScrollViewPager(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public void setScanScroll(boolean isCanScroll) {
		this.isCanScroll = isCanScroll;
	}

	@Override
	public void scrollTo(int x, int y) {
		super.scrollTo(x, y);
	}

	@SuppressLint("ClickableViewAccessibility")
	@Override
	public boolean onTouchEvent(MotionEvent arg0) {
		// TODO Auto-generated method stub
		if (isCanScroll) {
			return super.onTouchEvent(arg0);
		} else {
			return false;
		}

	}

	@Override
	public boolean onInterceptTouchEvent(MotionEvent arg0) {
		// TODO Auto-generated method stub
		if (isCanScroll) {
			return super.onInterceptTouchEvent(arg0);
		} else {
			return false;
		}
	}

	@Override
	public void setCurrentItem(int item, boolean smoothScroll) {
		// TODO Auto-generated method stub
		super.setCurrentItem(item, smoothScroll);
	}

	@Override
	public void setCurrentItem(int item) {
		// TODO Auto-generated method stub
		super.setCurrentItem(item, false);
	}
}

다음은 제가 사용자 정의한 ViewPagerFragment입니다. 구조 함수에서layout의 id를 매개 변수로 레이아웃 파일을 연결하여 코드를 복원합니다.
여기서 mViewPager는 android입니다.support.v4.view.ViewPager 유형입니다.
SingleViewPagerFragment.java
public class SingleViewPagerFragment extends Fragment {

	// TabLayout
	protected TabLayout mTabLayout;
	// ViewPager
	protected ViewPager mViewPager;
	// Title
	protected List mTitle;
	// Fragment
	protected List mFragment;
	// View
	protected View view;

	private int layout;
	
	public SingleViewPagerFragment(int layout) {
		// TODO Auto-generated constructor stub
		this.layout = layout;
	}
	
	public SingleViewPagerFragment() {
		// TODO Auto-generated constructor stub
	}
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// this.requestWindowFeature(Window.FEATURE_NO_TITLE);//     
	}

	/*
	 *      
	 */
	@SuppressLint("InflateParams")
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		if (view != null) {
			ViewGroup parent = (ViewGroup) view.getParent();
			if (parent != null) {
				parent.removeView(view);
			}
			return view;
		}
		view = inflater.inflate(layout, null);

		initData();
		initView(view);
		return view;
	}
	
	protected void initData() {

		mTitle = new ArrayList();
		mFragment = new ArrayList();
		// DatabaseQuery.CollegeMkdirs();//         
	}

	/*
	 *    view
	 */
	protected void initView(View v) {

	}
}

다음은 layout 파일입니다.



    
    

    


마지막으로 구체적인 ViewPager는 내가 정의한 Single ViewPager Fragment를 계승하고 initView에서 다음 코드를 사용합니다.
mViewPager = (NoScrollViewPager) v.findViewById(R.id.main_ViewPager);
NoScroolViewPager를 가져옵니다.그 결과 제목에 서술한 이상이 나타났다.
//MainViewPagerFragment.java
public class MainViewPagerFragment extends SingleViewPagerFragment {
	public MainViewPagerFragment(int layout) {
		super(layout);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
	}

	public MainViewPagerFragment() {
		// TODO Auto-generated constructor stub
	}
	
	protected void initData() {
		super.initData();
		mTitle.add("   ");
		mTitle.add("   ");
		mTitle.add("   ");

		mFragment.add(new DeliverFragment());
		mFragment.add(new ReceiveFragment());
		mFragment.add(new UserFragment());
		// DatabaseQuery.CollegeMkdirs();//         
	}

	@Override
	protected void initView(View v) {
		// TODO Auto-generated method stub
		mTabLayout = (TabLayout) v.findViewById(R.id.main_TabLayout);
		mViewPager = (NoScrollViewPager) v.findViewById(R.id.main_ViewPager);
		super.initView(v);
		//      
		MainPagerAdapter myFragmentPagerAdapter = new MainPagerAdapter(getActivity().getSupportFragmentManager(),
				mFragment, mTitle, this.getActivity());
		mViewPager.setAdapter(myFragmentPagerAdapter);
		mViewPager.setOffscreenPageLimit(mTabLayout.getTabCount());

		// mViewPager
		mViewPager.addOnPageChangeListener(new OnPageChangeListener() {

			@Override
			public void onPageSelected(int arg0) {
				// TODO Auto-generated method stub
				mTabLayout.getTabAt(arg0).select();
			}

			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onPageScrollStateChanged(int arg0) {
				// TODO Auto-generated method stub

			}
		});

		mTabLayout.setupWithViewPager(mViewPager);
		for (int i = 0; i < mTabLayout.getTabCount(); i++) {
			mTabLayout.getTabAt(i).setCustomView(myFragmentPagerAdapter.getTabView(i));
		}
		mTabLayout.setSelectedTabIndicatorColor(Color.WHITE);
		// this.reflex(mTabLayout);
		mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

			@SuppressWarnings("deprecation")
			@Override
			public void onTabUnselected(Tab tab) {
				// TODO Auto-generated method stub
				switch (tab.getPosition()) {
				case 0:
					tab.getCustomView().findViewById(R.id.item_text).setBackgroundResource(R.drawable.empty_tab);
					break;
				case 1:
					tab.getCustomView().findViewById(R.id.item_text).setBackgroundResource(R.drawable.empty_tab);
					break;
				case 2:
					tab.getCustomView().findViewById(R.id.item_text).setBackgroundResource(R.drawable.empty_tab);
					break;
				}
				TextView textView = (TextView) tab.getCustomView().findViewById(R.id.item_text);
				textView.setTextColor(getResources().getColor(R.color.colorAccent));
			}

			@SuppressWarnings("deprecation")
			@Override
			public void onTabSelected(Tab tab) {
				// TODO Auto-generated method stub
				switch (tab.getPosition()) {
				case 0:
					tab.getCustomView().findViewById(R.id.item_text).setBackgroundResource(R.drawable.tab0);
					break;
				case 1:
					tab.getCustomView().findViewById(R.id.item_text).setBackgroundResource(R.drawable.tab1);
					break;
				case 2:
					tab.getCustomView().findViewById(R.id.item_text).setBackgroundResource(R.drawable.tab2);
					break;
				}
				TextView textView = (TextView) tab.getCustomView().findViewById(R.id.item_text);
				textView.setTextColor(getResources().getColor(R.color.colorSelected));
				mViewPager.setCurrentItem(tab.getPosition());
			}

			@Override
			public void onTabReselected(Tab arg0) {
				// TODO Auto-generated method stub

			}
		});
		mViewPager.setCurrentItem(0);
		mTabLayout.getTabAt(0).select();
	}
}

이상을 일으킨 원인은 내가 Fragment에서 NoScrool ViewPager를 얻었을 때만 강제로 전환했을 뿐,layout에서android를 사용하지 않았기 때문이다.support.v4.view.ViewPager가 사용자 정의 NoScrollViewPager로 바뀌었습니다. 올바른 layout 파일은 다음과 같습니다.



    
    

    


지혜롭지 못한 잘못...더 이상 괴롭히고 싶지 않아!

좋은 웹페이지 즐겨찾기